sleep vs wait

2019-03-06  本文已影响0人  划水者

sleep是Thread持有的方法,而wait是Object类持有的对象;

sleep在持有锁的过程中不会释放锁,而wait在持有锁的过程中会释放锁;

实验代码:

分别注释掉红框中的俩行代码,运行看实验结果,如果注释掉Thread.sleep(2000),最终的运行结果为110,如果注释掉this.wait(2000),最终的运行结果为2100;下面来分析下这段代码的运行原理,main()方法中实例化ThreadTest并启动该线程,然后调用该线程的一个方法(secondMethod()),

因为在主线程中调用方法,所以调用的普通方法secondMethod())会先被执行(但并不是普通方法执行完毕该对象的线程方法才执行,

普通方法执行过程中,该线程的方法也会被执行,他们是交替执行的,只是在主线程的普通方法会先被执行而已),

所以程序运行时会先执行secondMethod(),而secondMethod()方法代码片段中有synchronized block,

因此secondMethod方法被执行后,该方法会占有该对象机锁导致该对象的线程方法一直处于阻塞状态,不能执行,直到secondeMethod释放锁;

使用Thread.sleep(2000)方法时,因为sleep在阻塞线程的同时,并持有该对象锁,所以该对象的其他同步线程(secondMethod())

无法执行,直到synchronized block执行完毕(sleep休眠完毕),secondMethod()方法才可以执行,因此输出结果为number*200+100;

使用this.wait(2000)方法时,secondMethod()方法被执行后也锁定了该对象的机锁,执行到this.wait(2000)时,

      该方法会休眠2S并释当前持有的锁,此时该线程的同步方法会被执行(因为secondMethod持有的锁,已经被wait()所释放),因此输出的结果为:number+100

上一篇 下一篇

猜你喜欢

热点阅读