`

ReentrantReadWriteLock 和 J道中的DDD

阅读更多

多线程读取并修改一个资源时,我们过去通常使用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();
}
 
}
分享到:
评论

相关推荐

    08、读写锁ReentrantReadWriteLock&StampLock详解-ev

    读写锁ReentrantReadWriteLock&StampLock详解_e读写锁ReentrantReadWriteLock&StampLock详解_e读写锁ReentrantReadWriteLock&StampLock详解_e读写锁ReentrantReadWriteLock&StampLock详解_e读写锁...

    ReadWriteLock接口及其实现ReentrantReadWriteLock方法

    在 ReentrantReadWriteLock 中,有两个内部类:ReadLock 和 WriteLock,这两个内部类分别实现了读锁和写锁的功能。 ReadLock 和 WriteLock ReadLock 和 WriteLock 都是 ReentrantReadWriteLock 的内部类,它们实现...

    深入浅出ReentrantReadWriteLock源码解析.docx

    ReentrantReadWriteLock是Java并发包中的一个核心类,它提供了读写锁的实现,使得多个线程可以并发读取共享资源,但写操作是互斥的,即同一时间只能有一个线程进行写操作。这种设计大大提高了多线程环境下对共享资源...

    Java多线程 ReentrantReadWriteLock原理及实例详解

    Java的ReentrantReadWriteLock是Java并发包`java.util.concurrent.locks`中的一个重要工具,它提供了一种更细粒度的锁定机制,相比普通的独占锁(如ReentrantLock)在某些场景下能显著提高程序的并发性能。...

    Java 多线程与并发(12-26)-JUC锁- ReentrantReadWriteLock详解.pdf

    通过理解ReentrantReadWriteLock的工作原理和设计,开发者可以更好地在多线程环境中控制并发访问,提高程序的效率和安全性。在面试或实际开发中,掌握这些知识点对于解决复杂并发问题是至关重要的。

    8、读写锁ReentrantReadWriteLock&StampLock详解.pdf

    根据提供的文件信息,本文将详细解析读写锁`ReentrantReadWriteLock`以及`StampLock`在Java并发编程中的应用场景及其实现原理。 ### 一、读写锁介绍 #### 1.1 读写锁的基本概念 读写锁是一种特殊的锁机制,它可以...

    60.Lock-ReentranLock-ReentrantReadWriteLock.mp4

    在学习Java过程中,自己收集了很多的Java的学习资料,分享给大家,有需要的欢迎下载,希望对大家有用,一起学习,一起进步。

    6.5 深入理解 AQS之 ReentrantReadWritelock 实战副本.mp4

    6.5 深入理解 AQS之 ReentrantReadWritelock 实战副本.mp4

    6.5 深入理解 AQS之 ReentrantReadWritelock 实战副本副本.mp4

    6.5 深入理解 AQS之 ReentrantReadWritelock 实战副本副本.mp4

    ReentrantReadWriteLock.xmind

    ReentrantReadWriteLock 读写锁除了保证写操作对读操作可见性以及并发行提升外,简化了读写交互场景开发

    log4j.properties配置分级别单独打印

    在众多日志框架中,Apache Log4j因其灵活性和强大的功能备受青睐。本文将深入探讨如何通过Log4j的配置实现按级别单独打印日志至不同的文件,以及两种实现这一目标的方法。 ### 关键配置项解析 首先,我们来看一段...

    contention-profiling:ReentrantLock 和 ReentrantReadWriteLock 上的配置文件争用

    `ReentrantLock`和`ReentrantReadWriteLock`是Java并发包`java.util.concurrent.locks`中的两个重要工具,它们提供了比标准`synchronized`关键字更高级别的锁控制机制。本文将深入探讨这两个类,以及如何通过配置...

    Java concurrency之共享锁和ReentrantReadWriteLock_动力节点Java学院整理

    本篇文章主要介绍了Java concurrency之共享锁和ReentrantReadWriteLock,非常具有实用价值,需要的朋友可以参考下

    ReadWriteLock的使用

    ReadWriteLock的使用,实际上由于ReadWriteLock是一个接口,所以实际使用的是ReentrantReadWriteLock子类。同时ReadWriteLock的使用其实也是比较简单的,就是读写的锁的使用以及注意事项而已。

    深入浅出_Java并发工具包原理讲解

    Java并发工具包(J.U.C)是Java编程语言中用于并发编程的一系列工具包的统称,它包含了一系列方便实现多线程编程的类和接口,使得开发者可以更加方便地编写高效、线程安全的程序。本文将深入浅出地探讨J.U.C的原理和...

    Java分布式应用学习笔记06浅谈并发加锁机制分析

    总结来说,Java中的并发加锁机制非常灵活且强大,通过对`ReentrantLock`和`ReentrantReadWriteLock`等工具的理解和应用,可以有效地解决多线程环境下的并发控制问题。希望本文能帮助读者更好地理解和掌握Java并发...

    浅谈多线程中的锁的几种用法总结(必看)

    "浅谈多线程中的锁的几种用法总结" ...锁机制是多线程编程中的一种常见的同步机制,ReentrantLock 和 ReentrantReadWriteLock 是 Java 中两个常用的锁机制。理解锁机制的原理和应用场景是多线程编程的关键。

    读者写者公平操作

    总结来说,Java中的读者写者公平操作是通过`ReentrantReadWriteLock`类实现的,它允许我们为读者和写者设置公平的访问策略,保证了多线程环境下的资源同步和数据一致性。理解和熟练应用这一机制对于开发高并发的Java...

    JAVA API1.5中文帮助文档

    此外,还新增了synchronized锁的改进,如可中断锁(InterruptedException)和读写锁(ReentrantReadWriteLock),提供了更灵活的同步策略。 此外,Java 1.5在I/O流上进行了优化,引入了nio(New IO)包,提供了一种...

Global site tag (gtag.js) - Google Analytics