- 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);
}