【多线程2】:死锁+示例代码

什么是死锁:

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

示例代码:

package com.seesun2012.csdn.cn;
/**
 * 死锁
 * 
 * @author [email protected]
 *
 */
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)来代替使用内部锁机制。
对于数据库锁,加锁和解锁鼻息在一个数据库连接里进行,否则会出现解锁失败的情况。


























注:以上内容仅提供参考和交流,请勿用于商业用途,如有侵权联系本人删除!


持续更新中…

如有对思路不清晰或有更好的解决思路,欢迎与本人交流,QQ群:273557553,个人微信:
你遇到的问题是小编创作灵感的来源!


你可能感兴趣的:(Java,多线程并发编程)