use*_*006 6 java multithreading
如何防止并发访问.我有这样的代码
public class MC implements Runnable {
    public void run() {
        sync();
    }
    public static void main(String p[]){
        MC mc = new MC();
        MC mc2 = new MC();
        MC mc3 = new MC();
        MC mc4 = new MC();
        Thread t = new Thread(mc);
            t.start();
            Thread t2 = new Thread(mc2);
            t2.start();
            Thread t3 = new Thread(mc3);
            t3.start();
            Thread t4 = new Thread(mc4);
            t4.start();
    }
    private synchronized void sync(){
        try {
            System.out.println(System.currentTimeMillis());
            Thread.sleep(10000);
        } catch (InterruptedException ex) {
            ex.printStackTrace();
        }
    }
}
Run Code Online (Sandbox Code Playgroud)
我得到这样的输出
1307082622317
1307082622317
1307082622317
1307082622317
BUILD SUCCESSFUL (total time: 11 seconds)
Run Code Online (Sandbox Code Playgroud)
任何建议?
Boh*_*ian 10
使你的方法静态:
private static synchronized void sync();
Run Code Online (Sandbox Code Playgroud)
您编码的方法在实例上同步,但每个线程都有自己的实例,因此没有同步.
静态方法在Class对象上同步,每个类只有一个,因此所有实例都将在静态方法上同步.
你有四个独立的MC对象.通常在那些()上运行实例方法sync,它们不应相互干扰.您可以使用synchronized块来确保一次只运行一个块,但您需要考虑要同步的内容:
this,我会阻止你这样做.(任何其他代码都可以在同一个对象上同步.)听起来你想要后一种方法,但对我来说听起来并不是很棒.如果你真的想以这种方式实现它,你可以使用:
public class MC implements Runnable {
    private static readonly Object lock = new Object();
    ...
    private void sync() {
        synchronized (lock) {
            try {
                System.out.println(System.currentTimeMillis());
                Thread.sleep(10000);
            } catch (InterruptedException ex) {
                ex.printStackTrace();
            }
        }
    }
}
Run Code Online (Sandbox Code Playgroud)
保持sync同步方法但使其保持静态也会起作用,但是你再次锁定一个公开可见的对象(MC.class),我通常不鼓励这样做.
|   归档时间:  |  
           
  |  
        
|   查看次数:  |  
           8168 次  |  
        
|   最近记录:  |