DeadLock
2015-07-23
次访问
DeadLock
刚开始想着 methodA 方法用两个同步锁来实现,即成为如下形式:
synchronized(A) {
//Do something
}
synchronized(B) {
//Do something
}
methodB 方法中反过来,成为如下形式。
synchronized(B) {
//Do something
}
synchronized(A) {
//Do something
}
但是在试验失败之后,想明白了,所谓死锁的前提就是你占用一个竞争资源,然后你还要去申请你想要的竞争资源,而对方则占用着你想要的竞争资源,去申请你现在正在占有着的资源。也就是申请之前双方各占一个资源,这样才能形成死锁,但是如上面的形式,则在申请之前,早已经将自己的锁释放了,也就不会造成死锁了。
Code
package Concurrency;
//写一个死锁
public class DeadLock implements Runnable {
private static String A = "A";
private static String B = "B";
public static void methodA() {
synchronized (A) {
try {
System.out.println(A);
Thread.sleep(2000);
} catch (InterruptedException e) {
e.printStackTrace();
}
System.out.println("Begin to wait for B....");
synchronized (B) {
System.out.println(B);
}
}
}
public static void methodB() {
synchronized (B) {
System.out.println(B);
try {
Thread.sleep(2000);
} catch (InterruptedException e) {
e.printStackTrace();
}
System.out.println("Begin to wait for A....");
synchronized (A) {
System.out.println(A);
}
}
}
@Override
public void run() {
String name = Thread.currentThread().getName();
if (name.equals("TestA")) {
methodA();
} else {
methodB();
}
}
public static void main(String[] args) {
Thread t1 = new Thread(new DeadLock());
Thread t2 = new Thread(new DeadLock());
t1.setName("TestA");
t2.setName("TestB");
t1.start();
t2.start();
}
}
运行结果:
B
A
Begin to wait for B....
Begin to wait for A....
Summary
正是纸上得来终觉浅,绝知此事要躬行啊。自己以前认为很简单的死锁,实现起来,也不是那么容易。
自己写一遍,理解就会更深了。
多实践才是王道。