欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页

【JAVA】死锁的产生和解决思路

程序员文章站 2022-04-17 18:30:16
...
package p12.thread;

public class DeadLockTest {
	/*
	 * 模拟死锁的产生
	 */
	public static void main(String[] args) {
		/*
		 * 两个锁对象
		 */
		Object o1 = new Object();
		Object o2 = new Object();
		/*
		 * 两个线程
		 * t1持有o1,等待o2
		 * t2持有o2,等待o1
		 */
		Thread t1 = new Thread(()->{
			synchronized(o1) {
				try {
					Thread.sleep(500);
				} catch (InterruptedException e) {
					e.printStackTrace();
				}
				synchronized(o2) {
					System.out.println("11111");
				}
			}
		});
		Thread t2 =new Thread(()->{
			synchronized(o2) {
				try {
					Thread.sleep(500);
				} catch (InterruptedException e) {
					e.printStackTrace();
				}
				synchronized(o1) {
					System.out.println("2222");
				}
			}
		});
		t1.start();
		t2.start();
	}
	/*
	 * 死锁的解决办法:
	 * 		>通过加锁顺序
	 * 			每个线程都使用相同的顺序获取锁
	 * 			例如:
	 * 				让以上例子中的t1、t2线程都先获取锁o1,再获取锁o2。
	 * 			这种方法需要事先知道所有会用到的锁,并对这些锁做适当的排序。
	 * 
	 * 		>通过加锁时限
	 * 			当一个线程持有锁的时间达到一定值时,wait释放锁,等待一段随机的时间再重试。
	 * 			这种方法需要自己创建一个自定义锁(java.util.concurrent)
	 * 
	 * 		>死锁检测
	 * 			通过遍历锁关系来检测是否有死锁发生,
	 * 			例如:
	 * 				A线程持有a锁,现在需要b锁,通过遍历锁关系检测到B线程持有b锁且需要a锁时时,就释放所有锁等待一段时间后重试(wait)
	 */
	
}