java 多线程情况下的死锁(写一个死锁与死锁的出现条件)

死锁:

就是同时满足了四个条件,分别是:
(1) 互斥使用,一个资源只能被一个线程使用,当这个资源被占用的时候其他线程只用在旁边干等着,啥也不能干,只用等着当前使用这个资源的线程释放资源以后才可以用这个资源。
(2) 不可轮占,在使用是不能被抢占,要等着线程的资源使用完才会释放资源后才允许其他线程来调用。
(3) 占有且等待,自己正在使用一个资源的同时有了新的要求,还想要 使用其他资源,而其他资源被其他线程所占用,他就在占用的自己所使用的资源的同时等待着其他线程。
(4) 循环等待,A线程在占用一个资源的同时等待被另B线程所占用的资源,B线程恰好也在等着A线程所占用的资源。

// An highlighted block
	public static void main(String[] args) {
		// 先new两个资源出来
		Object obj1 = new Object();
		Object obj2 = new Object();

		// 1.1。new一个线程出来
		new Thread(() -> {
			// 1.2让他想拿到object01
			synchronized (obj1) {
				System.out.println(Thread.currentThread().getName() + "obj1");
				try {
					// 1.3再让线程1睡两秒钟,这个睡两秒钟是为了让后面的线程2先调用上obj2
					// 那么线程1就会等着线程而得资源,等着线程二使用完资源obj2以后才可以
					// 调用后面得obj2,其实就是等了四秒
					Thread.sleep(2000);
				} catch (InterruptedException e) {
					// TODO Auto-generated catch block
					e.printStackTrace();
				}
			}
			// 已经是两秒以后了,线程2已经调用了资源obj2了,这个时候去调用obj2
			synchronized (obj2) {
				System.out.println(Thread.currentThread().getName() + "obj2");
			}
		}).start();

		// 新建一个线程
		new Thread(() -> {
			// 去调用资源obj2
			synchronized (obj2) {
				System.out.println(Thread.currentThread().getName() + "obj2");
				try {
					// 睡两秒
					Thread.sleep(2000);
				} catch (InterruptedException e) {
					// TODO Auto-generated catch block
					e.printStackTrace();
				}
			}
			// 去调用已经被线程B占用的obj1,要等待线程A彻底运行完,释放了资源obj1以后才调用得到obj1,所有他是最后运行的
			synchronized (obj1) {
				System.out.println(Thread.currentThread().getName() + "obj1");
			}
		}).start();

	}

猜你喜欢

转载自blog.csdn.net/qq_49249150/article/details/107571951