Java7新特性(四)并发 2 Lock对象处理死锁
来源:互联网 发布:逆战刷复活币软件 编辑:程序博客网 时间:2024/06/07 04:57
本文主要根据《Java程序员修炼之道》整理的代码笔记片段
一个线程更新,备用线程确认更新 (Lock lock = new ReentrantLock(); boolean acquired = lock.tryLock(wait, TimeUnit.MILLISECONDS); //Java 5)
public interface ConfirmingMicroBlogNode { void propagateUpdate(Update upd_, ConfirmingMicroBlogNode backup_); boolean tryConfirmUpdate(ConfirmingMicroBlogNode other_, Update update_); String getIdent();}
public class FixedDeadlockWithLockMicroBlogNode implements ConfirmingMicroBlogNode { private static Update getUpdate(String s) { Update.Builder b = new Update.Builder(); b.updateText(s).author(new Author("Ben")); return b.build(); } private final String ident; private final Lock lock = new ReentrantLock(); public FixedDeadlockWithLockMicroBlogNode(String ident_) { ident = ident_; } @Override public String getIdent() { return ident; } @Override public void propagateUpdate(Update upd_, ConfirmingMicroBlogNode backup_) { boolean acquired = false; boolean done = false; while (!done) { int wait = (int) (Math.random() * 10); try { acquired = lock.tryLock(wait, TimeUnit.MILLISECONDS); if (acquired) { System.out.println(ident + ": recvd: " + upd_.getUpdateText() + " ; backup: " + backup_.getIdent()); done = backup_.tryConfirmUpdate(this, upd_); } } catch (InterruptedException e) { } finally { if (acquired) lock.unlock(); } if (!done) try { Thread.sleep(wait); } catch (InterruptedException e) { } } } @Override public boolean tryConfirmUpdate(ConfirmingMicroBlogNode other_, Update upd_) { long startTime = System.currentTimeMillis(); boolean acquired = false; try { int wait = (int) (Math.random() * 10); acquired = lock.tryLock(wait, TimeUnit.MILLISECONDS); if (acquired) { long elapsed = System.currentTimeMillis() - startTime; System.out.println(ident + ": recvd confirm: " + upd_.getUpdateText() + " from " + other_.getIdent() + " - took " + elapsed + " millis"); return true; } } catch (InterruptedException e) { } finally { if (acquired) lock.unlock(); } return false; } public static void main(String[] a) { final FixedDeadlockWithLockMicroBlogNode local = new FixedDeadlockWithLockMicroBlogNode( "localhost:8888"); final FixedDeadlockWithLockMicroBlogNode other = new FixedDeadlockWithLockMicroBlogNode( "localhost:8988"); final Update first = getUpdate("1"); final Update second = getUpdate("2"); new Thread(new Runnable() { public void run() { local.propagateUpdate(first, other); } }).start(); new Thread(new Runnable() { public void run() { other.propagateUpdate(second, local); } }).start(); }}
- Java7新特性(四)并发 2 Lock对象处理死锁
- Java7新特性(四)并发 3 CountDownLatch计数器对象
- Java7新特性(四)并发 4 Atomic、ConcurrentHashMap对象
- Java7新特性(四)并发 5 CopyOnWriteArrayList对象
- Java7新特性(四)并发 6 TransferQueue对象
- Java7新特性(四)并发 1 不可变对象及构造器
- Java7新特性(四)并发 7 ScheduledThreadPool
- Java7新特性(四)并发 8 forkjoin分支合并框架
- java7异常处理新特性
- java7新特性(转载)
- JAVA7新特性1---异常处理
- java7新特性之新语法2
- java7新特性——使用ThreadLocalRandom产生并发随机数
- java7新特性——使用ThreadLocalRandom产生并发随机数
- java7新特性——使用ThreadLocalRandom产生并发随机数
- Java7新特性(一)Coin
- Java7新特性(二)IO
- Java7新特性(三)DI
- Path类API详解
- c++ inline函数和宏、函数调用
- python----mysql链接汉字编码的问题
- Exchange Server 2013 运维系列——解决多域名同用户的配置问题
- java面向对象
- Java7新特性(四)并发 2 Lock对象处理死锁
- JS 验证密码 不能为空,必须含有数字、字母、特殊字符,长度在8-12位
- 字符串倒叙
- java面向对象
- flush,analyze
- ADB命令详解
- 2013-12-9 VS2008 error LNK2019: 无法解析的外部符号
- 图像表示 YCrCb
- Ubuntu下安装arm-linux-gcc-4.4.3.tar.gz (交叉编译环境)