浅谈java中死锁问题
知识点:死锁的产生、死锁的实例
一:死锁的产生
我们在解决多线程共享资源的线程同步问题时,会使用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();
}
}