1.死锁是如何产生的
synchronized(对象名){
需要同步的代码;
}
在上述代码中,需要获取对象的内部锁然后访问,最后释放内部锁。
假设有两个线程A和B,线程A获得了锁X,线程B获得了锁Y,然后都进入休眠时间。苏醒过后线程A需要获得锁X,线程B需要获得锁Y,然后双方都等待对方释放锁,由此线程陷入阻塞。
2.代码示例
public class TestDeadLock {
public void run() {
MyThread mt = new MyThread();
new Thread(mt, "张三").start();
new Thread(mt, "李四").start();
}
class MyThread implements Runnable {
private Object o1 = new Object();
private Object o2 = new Object();
private boolean flag = true;
@Override
public void run() {
if (flag) {
flag = false;
synchronized (o1) {
System.out.println("have 01");
try {
Thread.sleep(100);
} catch (InterruptedException e) {
e.printStackTrace();
}
synchronized (o2) {
System.out.println("have 02");
}
}
} else {
flag = true;
synchronized (o2) {
System.out.println(" have 002");
try {
Thread.sleep(100);
} catch (InterruptedException e) {
e.printStackTrace();
}
synchronized (o1) {
System.out.println(" have 001");
}
}
}
}
}
public static void main(String[] args) {
new TestDeadLock().run();
}
}
以上程序运行结果为:have 01
have 002
(以下代码陷入死锁不在执行)
3.一个减少死锁的方法
try{
需要执行的代码;
}finally{
把锁打开;
}