zoukankan      html  css  js  c++  java
  • 如何将一个类改造为线程安全

      对这个问题,好多人可能第一反应就是使用syschronized关键字,诚然应用这个关键字可以解决问题(仍是有条件线程安全的且低效的),但是在无意中看java源码时,看到了另一种更高效的方式—采用lock的方式。

    在ReentrantReadWriteLock的源码注释中,作者写了这样一段代码:

    class RWDictionary {

         private final Map<String, Data>  m = new TreeMap<String, Data>();

         private final ReentrantReadWriteLock rwl = new ReentrantReadWriteLock();

         private final Lock r = rwl.readLock();

         private final Lock w = rwl.writeLock();

         public Data get(String key) {

             r.lock(); try { return m.get(key); } finally { r.unlock(); }

         }

         public String[] allKeys() {

             r.lock(); try { return m.keySet().toArray(); } finally { r.unlock(); }

         }

         public Data put(String key, Data value) {

             w.lock(); try { return m.put(key, value); } finally { w.unlock(); }

         }

         public void clear() {

             w.lock(); try { m.clear(); } finally { w.unlock(); }

         }

      }

    这段代码同样实现了对TreeMap本来非线程安全的类,包装成了一个线程安全的类,且不存在Collections.SynchronizedMap的put_if_absent问题。

  • 相关阅读:
    Python Day 5 数字、字符串、列表、可变与不可变
    Python day 4 流程控制
    Python Day 3 变量命名规范、格式化输出
    python 实践项目
    python 实践项目 强密码检测
    Python Day 2
    SSH:分页实现
    SSH:dataSource配置问题
    关于 struts2 Unable to load configuration.
    题目1522:包含min函数的栈
  • 原文地址:https://www.cnblogs.com/weiwelcome0/p/2518558.html
Copyright © 2011-2022 走看看