日期:2014-05-20  浏览次数:20866 次

synchronized锁定变量吗
Java code

public class TT implements Runnable {
    private int b = 100;

    public void m1() {
        synchronized (this) {
            try {
                Thread.sleep(3000);
                b = 1000;
            } catch (InterruptedException e) {
                e.printStackTrace();
            }
            System.out.println("b1 = " + b);
        }
    }

    public void m2() {
        System.out.println("b2 = " + b);
    }

    public void run() {
        this.m1();
    }

    public static void main  (String[] args) throws Exception {
        TT t = new TT();
        Thread t1 = new Thread(t);
        t1.start();
        Thread.sleep(500);
        t.m2();
    }
}



输出
b2 = 100
b1 = 1000

如果把最后那个Thread.sleep(500)改成5000
那输出
b2 = 1000
b1 = 1000

请问下为什么输出不同。m1方法执行过程中
为什么m2方法可以调用b变量啊。
我自己理解。 synchronized锁定后。其中的代码都锁定了。
谢谢

------解决方案--------------------
因为m2()方法没有同步,只有同步代码块之间存在互斥,同步的和非同步的之间不互斥
public synchronized void m2() {//把m2也同步了
System.out.println("b2 = " + b);
}