一,背景
今天在刷面试题的时候,做到一道面试题,虽然看了答案,但有一个答案还是不理解。后来研究了一下,得到结论:线程拿到锁进行执行时,哪怕获得了CPU执行权,但是那个锁不能丢失,它后面执行的过程都需要带着锁,才能往下继续执行。
二,测试代码
/**
*
*/package 测试多线程wait和notify问题;
/**
* @author: KOLO
* @date:2018年9月26日 下午3:01:02
* @version: 1.0
*/
public class Test {
final static Object obj = new Object();
public static void main(String[] args) {
Thread t1 = new Thread() {
@Override
public void run() {
synchronized(obj) {
try {
System.out.println("哈哈哈!!!=========");
obj.wait();
System.out.println("我是t1!!!=========");
}catch (Exception e) {
e.printStackTrace();
}
}
}
};
t1.start();
try {
Thread.sleep(1000);
} catch (InterruptedException e) {
e.printStackTrace();
}
Thread t2 = new Thread() {
@Override
public void run() {
synchronized(obj) {
obj.notifyAll();
System.out.println("我是T2!!!");
System.out.println("释放锁了!");
}
}
};
t2.start();
}
}
上面代码的执行流程如上图所示:
①红色块代表代码的执行流程
②紫色区域代表问题区域:在这个紫色区域,哪怕是线程T1拿到了cpu的执行权,但是也不会执行代码,因为它没有锁。最后还是要线程T2释放了锁,T1线程才会继续往下执行。
结论:当线程在执行过程中,需要要持有锁,才能继续往下执行。