在使用某些种类的 Collection 时,可以使用 ReentrantReadWriteLock 来提高并发性。通常,在预期 collection 很大,读取者线程访问它的次数多于写入者线程,并且 entail 操作的开销高于同步开销时,这很值得一试。例如,以下是一个使用 TreeMap 的类,预期它很大,并且能被同时访问
代码实例:
import java.util.Map; import java.util.TreeMap; import java.util.concurrent.locks.Lock; import java.util.concurrent.locks.ReentrantReadWriteLock; /** * 读写锁的使用 * */ public class ReentrantReadWriteLockMap<T> { private final Map<String,T> treeMap=new TreeMap<String,T>(); /** 公平策略的读写锁 */ private final ReentrantReadWriteLock rwl=new ReentrantReadWriteLock(true); private final Lock rl=rwl.readLock(); private final Lock wl=rwl.writeLock(); public T get(String key){ rl.lock(); try{ return treeMap.get(key); }finally{ rl.unlock(); } } public String[] allKeys() { rl.lock(); try{ return (String[]) treeMap.keySet().toArray(); }finally{ rl.unlock(); } } public T put(String key ,T value){ wl.lock(); try{ return treeMap.put(key, value); }finally{ wl.unlock(); } } public void clear(){ wl.lock(); try{ treeMap.clear(); }finally{ wl.unlock(); } } public static void main(String[] args) { final ReentrantReadWriteLockMap<String> map=new ReentrantReadWriteLockMap<String>(); new Thread(){ public void run(){ for(int i=1;i<=10000;i++){ try { Thread.sleep(10); } catch (InterruptedException e) { e.printStackTrace(); } map.put("key:"+i, Integer.toString(i)); } } }.start(); new Thread(){ public void run(){ for(int i=1;i<=10000;i++){ try { Thread.sleep(100); } catch (InterruptedException e) { e.printStackTrace(); } String t=map.get("key:"+i); if(t==null||"".equals(t)){ } System.out.println(map.get("key:"+i)); } } }.start(); } }
允许从写入锁降级为读取锁,其实现方式是:先获取写入锁,然后获取读取锁,最后释放写入锁。但是,从读取锁升级到写入锁是不可能的。
代码实例:
/** * 摘抄自JDK文档的伪代码 */ class CachedData { Object data; volatile boolean cacheValid; ReentrantReadWriteLock rwl = new ReentrantReadWriteLock(); void processCachedData() { rwl.readLock().lock(); if (!cacheValid) { // Must release read lock before acquiring write lock rwl.readLock().unlock(); rwl.writeLock().lock(); // Recheck state because another thread might have acquired // write lock and changed state before we did. if (!cacheValid) { data = ... cacheValid = true; } // Downgrade by acquiring read lock before releasing write lock rwl.readLock().lock(); rwl.writeLock().unlock(); // Unlock write, still hold read } use(data); rwl.readLock().unlock(); } }
相关推荐
Java并发包源码分析(JDK1.8):囊括了java.util.concurrent包中大部分类的源码分析,其中涉及automic包,locks包(AbstractQueuedSynchronizer、ReentrantLock、ReentrantReadWriteLock、LockSupport等),queue...
这份资源旨在介绍 Java Locks 框架中的 Lock 接口及其相关内容。Lock 接口是 Locks 框架的核心,提供了更加灵活和可控的线程同步机制,用于替代传统的 synchronized 关键字。 Lock 接口概述: 简要介绍 Lock 接口,...
In this chapter, we will cover: 1.Synchronizing a method; 2.Arranging independent ... 5.Synchronizing data access with read/write locks 6.Modifying Lock fairness 7.Using multiple conditions in a Lock
java.util.concurrent.locks 为锁和等待条件提供一个框架的接口和类,它不同于内置同步和监视器。 java.util.jar 提供读写 JAR (Java ARchive) 文件格式的类,该格式基于具有可选清单文件的标准 ZIP 文件格式。 ...
主要介绍了java中Locks的使用详解,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧
java.util.concurrent.locks 为锁和等待条件提供一个框架的接口和类,它不同于内置同步和监视器。 java.util.jar 提供读写 JAR (Java ARchive) 文件格式的类,该格式基于具有可选清单文件的标准 ZIP 文件格式。 java...
注意:如果您使用并需要此包的锁定功能(并且您可能这样做...请参阅本自述文件底部的“为什么?”部分),您应该查看 。 它基本上是 gridfs-stream + gridfs-locks。v1.x 中的新增功能遵循约定,版本 1.x 包含对...
java.util.concurrent.locks 为锁和等待条件提供一个框架的接口和类,它不同于内置同步和监视器。 java.util.jar 提供读写 JAR (Java ARchive) 文件格式的类,该格式基于具有可选清单文件的标准 ZIP 文件格式。 java...
无论是工作学习,不断的总结是必不可少的。只有不断的总结,发现问题,弥补不足,才能长久的...java.util.concurrent.locks包下常用的类 326 NIO(New IO) 327 volatile详解 337 Java 8新特性 347 Java 性能优化 362
局限性这不支持navigator.locks.request(name, [options,] callback)的options参数。 因此,仅支持默认选项。 当前不支持navigator.locks.query 。 这使用localStorage作为锁定形式。 默认情况下,它期望这些锁仅...
java.util.concurrent.locks 为锁和等待条件提供一个框架的接口和类,它不同于内置同步和监视器。 java.util.jar 提供读写 JAR (Java ARchive) 文件格式的类,该格式基于具有可选清单文件的标准 ZIP 文件格式。 ...
Web Locks API打算在将来合并到Node.js中。 特征 最简单的并行编程原语,用于解决数据争用和争用条件的问题。 Node.js和支持。 针对某些情况的不同优化实现:单线程异步锁,具有单个统一API的多线程锁。 安装 $ ...
这份资源旨在详细讲解 Java 中的 Locks 框架,特别关注 ReentrantLock 的使用和原理。Locks 框架提供了比传统的 synchronized 关键字更强大、更灵活的线程同步机制,而 ReentrantLock 是其中的一种重要实现。 Locks ...
java.util.concurrent.locks 为锁和等待条件提供一个框架的接口和类,它不同于内置同步和监视器。 java.util.jar 提供读写 JAR (Java ARchive) 文件格式的类,该格式基于具有可选清单文件的标准 ZIP 文件格式。 ...
四种元注释:java.lang.annotation中的类 元注释:注释注释的注释,用来限定注释的特征 @Terget 用来限定某个注释的使用范围,可以对什么元素进行注释 @Retention 用来描述注释的有效范围 @Inherited ...
java.util.concurrent.locks 为锁和等待条件提供一个框架的接口和类,它不同于内置同步和监视器。 java.util.jar 提供读写 JAR (Java ARchive) 文件格式的类,该格式基于具有可选清单文件的标准 ZIP 文件格式。 ...
本篇文章是对Synchronized和java.util.concurrent.locks.Lock的区别进行了详细的分析介绍,需要的朋友参考下
The release of Java SE 8 introduced significant enhancements that impact the Core Java technologies and APIs at the heart of the Java platform. Many old Java idioms are no longer required and new ...
java.util.concurrent.locks 为锁和等待条件提供一个框架的接口和类,它不同于内置同步和监视器。 java.util.jar 提供读写 JAR (Java ARchive) 文件格式的类,该格式基于具有可选清单文件的标准 ZIP 文件格式。 ...