死锁四个条件:
1.互斥条件:(一个资源只能被一个进程占用)
2.不可剥夺条件:(某个进程占有的资源,只有这个进程能释放)
3.循环条件:(多个进程之间 首尾相接的循环等待资源)
4.请求和保持条件:(进程会去请求资源,但是持有资源会保持不变,不释放)
上述的“进程”可以理解成“线程”
死锁例子:
public class TestDeadLock{
Object wait1 = new Object();
Object wait2 = new Object();
private void test1(){
try{
synchronized(wait1){
System.out.println("join test1 start...");
Thread.sleep(1000);
synchronized(wait2){
System.out.println("test1 抢wait2锁成功...");
}
System.out.println("join test1 end...");
}
}catch(InterruptedException e){
e.printStackTrace();
}
}
private void test2(){
try{
synchronized(wait2){
System.out.println("join test2 start...");
Thread.sleep(1000);
synchronized(wait1){
System.out.println("test2 抢wait1锁成功...");
}
System.out.println("join test2 end...");
}
}catch(InterruptedException e){
e.printStackTrace();
}
}
public static void main(String[] args) {
LockLockTest lock = new LockLockTest();
new Thread(new Runnable(){
@Override
public void run(){
lock.test1();
}
}).start();
new Thread(new Runnable(){
@Override
public void run(){
lock.test2();
}
}).start();
}
}
打印结果:
join test1 start...
join test2 start...
解读上述代码:
1.synchronized 就是满足死锁条件----互斥条件----
2.test1方法占用wait1资源 (synchronized(wait1))和 test2方法占用wait2资 源(synchorized(wait2)---不可剥夺条件---
3.test1 保持资源wait1请求资源wait2
test2 保持资源wait2 请求资源wait1
---请求和保持条件---
synchorized(wait1){
...
syschorized(wait2){
...
}
...
}
和
synchorized(wait2){
...
syschorized(wait1){
...
}
...
}
4.synchorized同时有两个进程争夺,就会升级为轻量级锁,也可以理解自旋锁。
例如:wait1资源目前A线程持有。B线程获取wait1资源,目前已被占有,只能CAS自旋等待资源。
---循环等待---
网友评论