【面试题】多线程在执行过程中,某个线程执行时,突然释放锁。会发生的特殊状态

一,背景

今天在刷面试题的时候,做到一道面试题,虽然看了答案,但有一个答案还是不理解。后来研究了一下,得到结论:线程拿到锁进行执行时,哪怕获得了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线程才会继续往下执行。

结论:当线程在执行过程中,需要要持有锁,才能继续往下执行。

猜你喜欢

转载自blog.csdn.net/daotiao0199/article/details/82854824