先来看这一段代码
public class ThreadDemo02 {
private static String result;
static String LOCK="LOCK";
public static void main(String[] args) {
new Thread(){
@Override
public void run() {
result="hello";
System.out.println("run");
synchronized (LOCK) {
System.out.println("sysn");
LOCK.notify();//通知,但此时不释放锁,必须等代码块执行结束
System.out.println("notify2");
}
}
}.start();
//while(result==null);
System.out.println("main");
synchronized (LOCK) {
System.out.println("mainsysn");
if(result==null){
System.out.println("wait+syn");
try{LOCK.wait();}catch(Exception e){}
}
}
System.out.println(
result.toUpperCase());
}
}
下面是一种执行结果:
main
run
mainsysn
sysn
HELLO
notify2
刚开始主线程抢到了CPU,于是打印了main,然后工作线程抢到了CPU,打印了run,然后主线程又抢到了CPU,进入LOCK方发锁,打印了mainsysn,然后工作线程抢到了CPU,也进入LOCK方发锁,打印了sysn,这是怎么回事呢,主线程也没执行wait方法,应该没释放锁啊,为什么工作线程能进入锁呢?
这是我开始的一个疑问,其实是对什么时候释放锁掌握的不全面,之前,我以为只有执行完wait或notify后才释放锁,其实还少了一种情况,就是该方法锁中的代码全执行完了后也会释放锁。
如上,工作线程执行完run方法后,result有值了,那么主线程中的代码块就已经执行完了,尽管没执行wait,但也释放了方发锁,所以工作线程才拿到了锁