网上看了一些关于synchronied的讨论,自己测试了一遍:
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() {
b=111;
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 = 111
b1 = 1000
总结:m2()方法没有同步,只有同步代码块之间存在互斥,同步的和非同步的之间不互斥。
并且m2()能更改b的值,不锁定同步。
如果m2也使用了synchronized(this),输出结果为:
b1 = 1000
b2 = 111