多线程读取并修改一个资源时,我们过去通常使用synchronized同步锁,这个是有性能损失的,很多情况下:资源对象总是被大量并发读取,偶尔有一个线程进行修改,也就是说:以读为主,修改不是很频繁,那么我们在JDK5.0中用ReentrantReadWriteLock就获得比synchronized更高并发性能,高并发性能是我使用JDK5.0主要目的,而不是annotation和泛型等设计优点。
ReentrantReadWriteLock被大量使用在缓存中,因为缓存中的对象总是被共享大量读操作,偶尔修改这个对象中的子对象,比如状态,那么只要通过ReentrantReadWriteLock来更新子对象就可以了,这就实现了Evans DDD中对不变性的要求,我们可以使用ReentrantReadWriteLock对根对象中生命周期短的子对象在内存中直接更新,不必依赖数据库锁,这又是一个摆脱数据库锁的进步。
以JiveJdon为例子,ForumThread 通常情况下保存在缓存中,而且是一个单例,那么并发多次请求访问缓存中ForumThread。
ForumThread中有ForumThreadState,根据Evans DDD将经常变换的对象生命周期和其他不变量区分开来,这样,需要修改时不必锁住整个根对象,在DDD一书中,锁住整个子对象是通过数据库锁来实现,而JiveJdon中,我们的对象在缓存中,也必须有一个机制来实现这种细腻度锁。见“实战DDD”
http://www.jdon.com/mda/ddd.html
这个状态子对象是每发一个贴就要更新修改的,而平时ForumThreadState 和ForumThread大量被读取,只有回帖者一个请求进行修改,为使其他人立即看到帖子更新,原先需要使用synchronized,但性能影响,现在就可以使用ReentrantReadWriteLock
protected final ReentrantReadWriteLock readWriteLock = new ReentrantReadWriteLock();
protected final Lock read = readWriteLock.readLock();
protected final Lock write = readWriteLock.writeLock();
public ForumThreadState getState() {
read.lock();
try {
return state;
} finally {
read.unlock();
}
}
/**
* @param forumThreadState The forumThreadState to set.
*/
public void setState(ForumThreadState forumThreadState) {
write.lock();
try {
this.state = forumThreadState;
} finally {
write.unlock();
}
}
分享到:
相关推荐
读写锁ReentrantReadWriteLock&StampLock详解_e读写锁ReentrantReadWriteLock&StampLock详解_e读写锁ReentrantReadWriteLock&StampLock详解_e读写锁ReentrantReadWriteLock&StampLock详解_e读写锁...
在 ReentrantReadWriteLock 中,有两个内部类:ReadLock 和 WriteLock,这两个内部类分别实现了读锁和写锁的功能。 ReadLock 和 WriteLock ReadLock 和 WriteLock 都是 ReentrantReadWriteLock 的内部类,它们实现...
ReentrantReadWriteLock是Java并发包中的一个核心类,它提供了读写锁的实现,使得多个线程可以并发读取共享资源,但写操作是互斥的,即同一时间只能有一个线程进行写操作。这种设计大大提高了多线程环境下对共享资源...
Java的ReentrantReadWriteLock是Java并发包`java.util.concurrent.locks`中的一个重要工具,它提供了一种更细粒度的锁定机制,相比普通的独占锁(如ReentrantLock)在某些场景下能显著提高程序的并发性能。...
通过理解ReentrantReadWriteLock的工作原理和设计,开发者可以更好地在多线程环境中控制并发访问,提高程序的效率和安全性。在面试或实际开发中,掌握这些知识点对于解决复杂并发问题是至关重要的。
根据提供的文件信息,本文将详细解析读写锁`ReentrantReadWriteLock`以及`StampLock`在Java并发编程中的应用场景及其实现原理。 ### 一、读写锁介绍 #### 1.1 读写锁的基本概念 读写锁是一种特殊的锁机制,它可以...
在学习Java过程中,自己收集了很多的Java的学习资料,分享给大家,有需要的欢迎下载,希望对大家有用,一起学习,一起进步。
6.5 深入理解 AQS之 ReentrantReadWritelock 实战副本.mp4
6.5 深入理解 AQS之 ReentrantReadWritelock 实战副本副本.mp4
ReentrantReadWriteLock 读写锁除了保证写操作对读操作可见性以及并发行提升外,简化了读写交互场景开发
8. Lock接口 (ReentrantLock 可重入锁) 特性 ReentantLock 继承接口 Lock 并实现了接口中定义的方法, 它是一种可重入锁, 除了能完成 synchronized ...Condition 类和 Object 类锁方法区别区别 Condition 类的 awiat
在众多日志框架中,Apache Log4j因其灵活性和强大的功能备受青睐。本文将深入探讨如何通过Log4j的配置实现按级别单独打印日志至不同的文件,以及两种实现这一目标的方法。 ### 关键配置项解析 首先,我们来看一段...
`ReentrantLock`和`ReentrantReadWriteLock`是Java并发包`java.util.concurrent.locks`中的两个重要工具,它们提供了比标准`synchronized`关键字更高级别的锁控制机制。本文将深入探讨这两个类,以及如何通过配置...
本篇文章主要介绍了Java concurrency之共享锁和ReentrantReadWriteLock,非常具有实用价值,需要的朋友可以参考下
ReadWriteLock的使用,实际上由于ReadWriteLock是一个接口,所以实际使用的是ReentrantReadWriteLock子类。同时ReadWriteLock的使用其实也是比较简单的,就是读写的锁的使用以及注意事项而已。
Java并发工具包(J.U.C)是Java编程语言中用于并发编程的一系列工具包的统称,它包含了一系列方便实现多线程编程的类和接口,使得开发者可以更加方便地编写高效、线程安全的程序。本文将深入浅出地探讨J.U.C的原理和...
总结来说,Java中的并发加锁机制非常灵活且强大,通过对`ReentrantLock`和`ReentrantReadWriteLock`等工具的理解和应用,可以有效地解决多线程环境下的并发控制问题。希望本文能帮助读者更好地理解和掌握Java并发...
"浅谈多线程中的锁的几种用法总结" ...锁机制是多线程编程中的一种常见的同步机制,ReentrantLock 和 ReentrantReadWriteLock 是 Java 中两个常用的锁机制。理解锁机制的原理和应用场景是多线程编程的关键。
总结来说,Java中的读者写者公平操作是通过`ReentrantReadWriteLock`类实现的,它允许我们为读者和写者设置公平的访问策略,保证了多线程环境下的资源同步和数据一致性。理解和熟练应用这一机制对于开发高并发的Java...