Java写一个死锁

2020/11/24 posted in  Java并发编程的艺术
public class DeadLockDemo {

	private static String A = "A";
	private static String B = "B";


	private void deadLock(){
		Thread  t1 = new Thread(new Runnable() {
			@Override
			public void run() {
				synchronized (A){
					try {
						Thread.currentThread().sleep(2000);
					} catch (InterruptedException e) {
						e.printStackTrace();
					}
					synchronized (B){
						System.out.println("t1");
					}
				}
			}
		});

		Thread  t2 = new Thread(new Runnable() {
			@Override
			public void run() {
				synchronized (B){
					synchronized (A){
						System.out.println("t2");
					}
				}
			}
		});

		t1.start();
		t2.start();
	}

	public static void main(String[] args) {
		new DeadLockDemo().deadLock();
	}
}

操作系统中,死锁发生的四个条件:

  1. 互斥条件
    一个资源每次只能被一个进程使用

  2. 占有且等待
    一个进程因请求资源而阻塞时,对已获得的资源保持不放

  3. 不可强行占有
    进程已获得的资源,在未使用完成之前,不能强行剥夺

  4. 循环等待
    进程之间形成一种头尾相接的循环等待资源关系