同步代码块什么时候释放锁

先来看这一段代码

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,但也释放了方发锁,所以工作线程才拿到了锁



评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值