死锁有两种情况
1、同步嵌套
同步方法中嵌套同步代码块或同步代码块嵌套同步代码块出现的错误
//死锁演示
//1.同步嵌套
class DeadTacket implements Runnable{
private int tacket=100;
boolean flog=true;
Object object=new Object();
@Override
public void run() {
if(flog) {
//线程1进入if循环第一部分获取到object锁
synchronized (object)
//object锁
{
Dead();//此时进入方法Dead();中获取this锁,
// 但this锁已经被else中的线程获取 方法无法继续
}
}
else{
Dead();//线程2获取到this锁
//然后进入同步代码块发现obj锁已经被线程1获取 线程2中的Dead();方法无法继续
}
}
public synchronized void Dead(){
//同步方法中为this锁
synchronized (object){
while (tacket > 0)
System.out.println(Thread.currentThread().getName() + "剩余票" + tacket--);
}
}
}
public class DeadLockDemo {
public static void main(String[] args) throws InterruptedException {
DeadTacket deadTacket=new DeadTacket();
Thread t1=new Thread(deadTacket,"线程1");
Thread t2=new Thread(deadTacket,"线程2");
t1.start();
Thread.sleep(2);
deadTacket.flog=false;
t2.start();
}
}
网友评论