多线程-死锁代码示例

原文出自:https://blog.csdn.net/seesun2012

什么是死锁:
死锁是指两个或两个以上的进程在执行过程中,由于竞争资源或者由于彼此通信而造成的一种阻塞的现象,若无外力作用,它们都将无法推进下去。此时称系统处于死锁状态或系统产生了死锁,这些永远在互相等待的进程称为死锁进程。

示例代码:

package com.seesun2012.csdn.cn;
/**
 * 死锁
 * 
 * @author seesun2012@163.com
 *
 */
public class DeadLockDemo {
	private static String A = "A";
	private static String B = "B";
	
	
	public static void main(String[] args) {
		new DeadLockDemo().deadlock();
	}
	
	private void deadlock() {
		//  定义t1线程,锁定A变量睡眠2秒去抢占B的资源
		Thread t1 = new Thread(new Runnable() {
			@Override
			public void run() {
				System.out.println("进入线程t1");
				synchronized (A) {
					try {
						Thread.currentThread();
						Thread.sleep(2000);
					} catch (InterruptedException e) {
						e.printStackTrace();
					}
					synchronized (B) {
						System.err.println("1");
					}
				}
			}
		});
		
		//  定义t2线程,锁定B变量去抢占A的资源
		Thread t2 = new Thread(new Runnable() {
			@Override
			public void run() {
				System.out.println("进入线程t2");
				synchronized (B) {
					synchronized (A) {
						System.out.println("2");
					}
				}
			}
		});
		
		//  启动线程
		t1.start();
		t2.start();
		
	}
	
}

如何避免死锁?
避免一个线程同时获取多个锁。
避免一个线程在锁内同时占用多个资源,尽量保证每个锁只占用一个资源。
尝试使用定时锁,使用lock.tryLock(timeout)来代替使用内部所机制。
对于数据库锁,加锁和解锁鼻息在一个数据库连接里进行,否则会出现解锁失败的情况。

原文地址:https://www.cnblogs.com/seesun2012/p/9214706.html