首页 诗词 字典 板报 句子 名言 友答 励志 学校 网站地图
当前位置: 首页 > 教程频道 > 软件管理 > 软件架构设计 >

死锁的演练

2013-10-30 
死锁的演示import java.util.concurrent.TimeUnitimport java.util.concurrent.locks.ReentrantLock/**

死锁的演示

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;    }}

?

热点排行