Java—死锁

一、死锁

同步锁使用的弊端:当线程任务中出现了多个同步(多个锁)时,如果同步中嵌套了其他的同步。这时容易引发一种现象:程序出现无限等待,这种现象我们称为死锁。

public class DeadLockTest {
	public static void main(String[] args) {
		DeadLock deadLock = new DeadLock();
		Thread t1 = new Thread(deadLock);
		Thread t2 = new Thread(deadLock);
		
		t1.start();
		t2.start();
	}
}

class DeadLock implements Runnable{
	int x = new Random().nextInt(1);//0,1

	Object lockA = new Object();
	Object lockB = new Object();
	@Override
	public void run() {
		while(true){
			if(x % 2 == 0){
				synchronized (lockA) {
					System.out.println("if-lockA");
					synchronized (lockB) {
						System.out.println("if-lockB");
						System.out.println("if-大口吃肉");
					}
				}
			}else{
				synchronized (lockB) {
					System.out.println("else-lockB");
					synchronized (lockA) {
						System.out.println("else-lockA");
						System.out.println("else-大口吃肉");
					}
				}
			}
			x++;
		}
	}
	
}

二、等待唤醒机制

线程之间的通信:多个线程在处理同一个资源,但是处理的动作(线程的任务)却不相同。通过一定的手段使各个线程能有效的利用资源。而这种手段即—— 等待唤醒机制

  • wait() : 等待,将正在执行的线程释放其执行资格和执行权,并存储到线程池中。
  • notify():唤醒,唤醒线程池中被wait()的线程,一次唤醒一个,而且是任意的。
  • notifyAll(): 唤醒全部:可以将线程池中的所有wait() 线程都唤醒。

所谓唤醒的意思就是让 线程池中的线程具备执行资格。必须注意的是,以上方法都是在同步中才有效。同时这些方法在使用时必须标明所属锁,这样才可以明确出这些方法操作的到底是哪个锁上的线程。

  • join() : 当前线程等待其它线程结束
原文地址:https://www.cnblogs.com/nadou/p/13984666.html