《并发的挑战》学习标注
多线程是我觉得初入JAVA中的一个难点,之前一直知道线程有阻塞死锁的状态,但是很抽象,但是真的让我自己写一个死锁的例子,我还真的有点下笔难的感觉,今天看到这本书的第一章,就学习到了一个简单的线程死锁例子,在这里分享出来:
public class DeadLockDemo {
private static String A = "A";
private static String B = "B";
public static void main(String[] args){
new DeadLockDemo().deadLock();;
}
private void deadLock(){
Thread t1=new Thread(new Runnable() {
public void run() {
synchronized (A) {
try {
System.out.println("A1");
Thread.currentThread().sleep(2000);
} catch (Exception e) {
// TODO: handle exception
}
synchronized (B) {
System.out.println("B1");
}
}
}
});
Thread t2=new Thread(new Runnable() {
public void run() {
synchronized (B) {
System.out.println("B2");
synchronized (A) {
System.out.println("A2");
}
}
}
});
t1.start();
t2.start();
}
}
运行之后可以看到输出结果为:
A1
B2
可以看到输出的结果是A1,B2说明两个线程都开始启动了。并且都进入了一开始的synchronized方法,然后由于方法1锁住了A,方法2锁住了B,导致第二段代码再去获取对方的对象String的锁的时候失败,所以可以看到synchronized的作用,是锁住传入进来的当前对象,传的是什么,就锁什么。如果传的是对象的.class,那么就锁住整个类,也是单例模式的很好的例子。
A1
B2