import java.util.Date;
public class MyThread implements Runnable {
int b = 100;
public synchronized void m1() throws Exception {
b = 1000;
Thread.sleep(5000);
System.out.println("b = " + b);
// Thread.sleep(2000);
}
public synchronized void m2() throws Exception {
Thread.sleep(2500);
b = 199;
System.out.println( "b=" + b );
}
public void run() {
try {
m1();
} catch (Exception e) {
e.printStackTrace();
}
}
public static void main(String[] args) throws Exception {
MyThread tt = new MyThread();
Thread t = new Thread(tt);
t.start();
// 让主线现先睡一秒,保证m2先执行
Thread.sleep(1000);
tt.m2();
// System.out.println("b"+tt.b);
// System.out.println("c"+tt.c);
}
}
代码输出结果:
b = 1000
b=199
分析:虽然方法m2,先修改b的值,但是方法m1 sleep时仍然持有对象锁而m2()方法也是synchonized方法,m2()执行前必须获取对象锁。所以只有当m1()执行完并释放锁后m2()拿到锁才能执行。
如果将m2的synchonized关键字去掉,程序输出结果为
b=199
b = 199
这是因为m2()执行时不需要获取锁,所以在m1() sleep时,m2()将 b 的值改成了199