对这个问题,好多人可能第一反应就是使用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问题。

相关文章:

  • 2022-12-23
  • 2022-01-22
  • 2021-11-30
  • 2021-06-07
  • 2021-09-30
  • 2021-11-25
  • 2022-01-29
猜你喜欢
  • 2022-01-03
  • 2021-11-25
  • 2022-12-23
  • 2021-06-18
  • 2021-11-24
  • 2021-07-24
  • 2022-12-23
相关资源
相似解决方案