import java.util.concurrent.TimeUnit;
import java.util.concurrent.locks.ReentrantLock;
/**
* 第一个线程获取local锁后,偿试获取other锁,如果失败,则等待5秒重试
* 同样第二个线程获取other锁后,偿试获取local锁,如果失败,则放弃等待5秒重试
* User: sunlong
* Date: 13-10-18
* Time: 下午5:10
*/
public class DeadLock {
public static void main(String[] args){
final Update a = new Update("this is a");
final Update b = new Update("this is b");
final App2 local = new App2("app1");
final App2 other = new App2("app2");
new Thread(new Runnable() {
@Override
public void run() {
local.update(a, other);
}
}).start();
new Thread(new Runnable() {
@Override
public void run() {
other.update(b, local);
}
}).start();
}
}
class Update{
private String text;
public Update(String text){
this.text = text;
}
public String getText(){
return this.text;
}
}
/**
* 这个是传统的syschronized方式演示死锁
*/
class App{
private final String indent;
public App(String indent){
this.indent = indent;
}
public synchronized void update(Update update, App backup){
System.out.println(indent + ": recvd:" + update.getText() + "; backup:" + backup.getIndent());
/*try{
TimeUnit.SECONDS.sleep(5);
}catch (Exception e){
}*/
backup.confirmUpdate(this, update);
}
private synchronized void confirmUpdate(App backup, Update update){
System.out.println(indent + ": recvd:" + update.getText() + "; backup:" + backup.getIndent());
}
String getIndent() {
return indent;
}
}
/**
* 用lock重写
*/
class App2{
private final String indent;
private final ReentrantLock lock = new ReentrantLock();
public App2(String indent){
this.indent = indent;
}
public void update(Update update, App2 backup){
boolean acquired = false;
boolean done = false;
while (!done){
System.out.println("--------------------------------");
try {
acquired = lock.tryLock(5, TimeUnit.MILLISECONDS);
if(acquired){
System.out.println(indent + ": recvd:" + update.getText() + "; backup:" + backup.getIndent());
done = backup.confirmUpdate(this, update);
}
} catch (InterruptedException e) {
e.printStackTrace();
} finally {
if(acquired){
lock.unlock();
}
}
if(!done){
try {
TimeUnit.SECONDS.sleep(5);
} catch (InterruptedException e) {
e.printStackTrace();
}
}
}
}
private boolean confirmUpdate(App2 backup, Update update){
boolean acquired = false;
try{
acquired = lock.tryLock(5, TimeUnit.MILLISECONDS);
if(acquired){
System.out.println(indent + ": recvd confirmed:" + update.getText() + "; backup:" + backup.getIndent());
return true;
}
} catch (InterruptedException e) {
e.printStackTrace();
} finally {
if(acquired){
lock.unlock();
}
}
return false;
}
String getIndent() {
return indent;
}
}