知识点:死锁的产生、死锁的实例

一:死锁的产生

我们在解决多线程共享资源的线程同步问题时,会使用synchronized关键字修饰方法或者通过Lock加锁方式修饰方法、代码块,防止多个线程访问统一资源产生的线程安全问题。但是当线程X持有锁A,等待锁B,而线程Y此时持有锁B,等待锁A时,就会出现X,Y两个线程互相等待的情况,这种情况就是死锁。

 

二:死锁实例

实例1  在下面的简单实例中,我们同时开启两个线程X、Y,线程X加sb1锁后,会在再次加sb2锁,线程Y加sb2锁后,会在再次加sb1锁,当线程X加sb1锁后,会在再次加sb2锁,同时线程Y加sb2锁后,再次等待X持有的sb1锁时,就会出现相互等待,便产生了死锁问题。

 

public class TestDeadLock {

static StringBuffer sb1=new StringBuffer(); //声明两个静态StringBuffer对象实例
static StringBuffer sb2=new StringBuffer();

public static void main(String[] args) {
new Thread(){    //声明两个线程实例,并start()启动线程,线程X
@Override
            public void run() {
try {
                    Thread.currentThread().sleep(500);
                } catch (InterruptedException e) {
                    e.printStackTrace();
                }
synchronized (sb1){  //加sb1锁后,向sb1对象加“A”字符串
sb1.append("A");
synchronized (sb2){  //加sb2锁后,向sb2对象加“B”字符串
sb2.append("B");
                        System.out.println(sb1);
                        System.out.println(sb2);
                    }
                }
            }
        }.start();

new Thread(){ 线程Y
@Override
            public void run() {
try {
                    Thread.currentThread().sleep(500);
                } catch (InterruptedException e) {
                    e.printStackTrace();
                }
synchronized (sb2){ //加sb2锁后,向sb1对象加“C”字符串
sb1.append("C");  
synchronized (sb1){ //加sb1锁后,向sb1对象加“D”字符串
sb2.append("D");
                        System.out.println(sb1);
                        System.out.println(sb2);
                    }
                }
            }
        }.start();
    }
}