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() : 当前线程等待其它线程结束