线程读写同一个对象的数据是很普遍的,通常,要避免读写冲突,必须保证任何时候仅有一个线程在写入,有线程正在读取的时候,写入操作就必须等待。简单说,就是要避免“写-写”冲突和“读-写”冲突。但是同时读是允许的,因为“读-读”不冲突,而且很安全。
要实现以上的ReadWriteLock,简单的使用synchronized就不行,我们必须自己设计一个ReadWriteLock类,在读之前,必须先获得“读锁”,写之前,必须先获得“写锁”。举例说明:
DataHandler对象保存了一个可读写的char[]数组:
package com.crackj2ee.thread;
public class DataHandler {
// store data:
private char[] buffer = "AAAAAAAAAA".toCharArray();
private char[] doRead() {
char[] ret = new char[buffer.length];
for(int i=0; i<buffer.length; i++) {
ret[i] = buffer[i];
sleep(3);
}
return ret;
}
private void doWrite(char[] data) {
if(data!=null) {
buffer = new char[data.length];
for(int i=0; i<buffer.length; i++) {
buffer[i] = data[i];
sleep(10);
}
}
}
private void sleep(int ms) {
try {
Thread.sleep(ms);
}
catch(InterruptedException ie) {}
}
}
doRead()和doWrite()方法是非线程安全的读写方法。为了演示,加入了sleep(),并设置读的速度大约是写的3倍,这符合通常的情况。
为了让多线程能安全读写,我们设计了一个ReadWriteLock:
package com.crackj2ee.thread;
public class ReadWriteLock {
private int readingThreads = 0;
private int writingThreads = 0;
private int waitingThreads = 0; // waiting for write
private boolean preferWrite = true;
public synchronized void readLock() throws InterruptedException {
while(writingThreads>0 || (preferWrite && waitingThreads>0))
this.wait();
readingThreads++;
}
public synchronized void readUnlock() {
readingThreads--;
preferWrite = true;
notifyAll();
}
public synchronized void writeLock() throws InterruptedException {
waitingThreads++;
try {
while(readingThreads>0 || writingThreads>0)
this.wait();
}
finally {
waitingThreads--;
}
writingThreads++;
}
public synchronized void writeUnlock() {
writingThreads--;
preferWrite = false;
notifyAll();
}
}
分享到:
相关推荐
读写锁(ReadWriteLock)是多线程编程中一种重要的同步机制,主要用于提高并发性能。在Windows环境下,C++可以通过自定义实现或者使用系统提供的API来创建读写锁。在这个项目中,`ReadWriteLock.cpp` 和 `...
ReadWriteLock的使用,实际上由于ReadWriteLock是一个接口,所以实际使用的是ReentrantReadWriteLock子类。同时ReadWriteLock的使用其实也是比较简单的,就是读写的锁的使用以及注意事项而已。
在Java的并发编程中,ReadWriteLock 是一个非常重要的接口,它允许多个线程同时读共享数据,而写操作则是互斥的。这种锁机制特别适合于读多写少的场景,可以显著提高程序的性能和吞吐量。本文将详细介绍 ...
《Java并发编程学习宝典(漫画版)》中提到的23章主要讲解了Java并发编程中的一个重要概念——ReadWriteLock,即读写锁。ReadWriteLock是`java.util.concurrent.locks`包下的一个接口,它是对传统互斥锁的一个扩展,...
读写锁是一种多线程同步机制,用于提高并发性能,特别是在读操作远多于写操作的情景下。在Java中,`java.util.concurrent.locks.ReadWriteLock`接口提供了这种功能,它有两个主要的方法:`readLock()` 和 `writeLock...
Java中的ReadWriteLock接口是Java并发包`java.util.concurrent.locks`中的一个重要组件,它提供了比单个锁更复杂的锁定机制。ReadWriteLock接口定义了两个锁:ReadLock(读锁)和WriteLock(写锁)。这种设计允许多...
ReadWriteLock 接口是 Java 中的一种锁机制,用于解决读写锁的问题。它定义了两个方法:readLock() 和 writeLock(),分别用于获取读锁和写锁。这个接口的主要作用是允许多个线程同时读取资源,但写操作需要独占资源...
以下是一个使用ReadWriteLock实现读写分离的例子: ```java package com.bird.concursey.charpet3; import java.util.concurrent.locks.ReadWriteLock; import java.util.concurrent.locks.ReentrantReadWriteLock...
在多线程编程中,读写锁(ReadWriteLock)是一种高效且灵活的同步机制,它允许多个线程同时读取共享资源,但在写入时只允许一个线程操作。Java的并发包`java.util.concurrent.locks`中提供了`ReentrantReadWriteLock...
Java的多线程编程中,读写锁(ReadWriteLock)是一种高效的并发控制机制,它将锁的权限进行了区分,允许多个线程同时读取资源,但仅允许一个线程进行写入操作。这种设计模式提高了数据共享的效率,因为读操作通常...
- **读写锁**: 除了ReentrantLock,Java还提供了ReadWriteLock接口,它包含两个Lock对象:一个用于读操作(ReadLock),允许多个线程同时读取共享资源;另一个用于写操作(WriteLock),一次只允许一个线程写入。...
在“panda-demo”项目中,作者可能创建了两个版本的代码,一个使用synchronized,另一个使用ReadWriteLock。然后通过性能测试(如JMH),对比它们在处理大量并发读写操作时的性能差异。通常,如果读操作远多于写操作...
使用 ForkJoinPool 进行分叉和合并,锁 Lock,读写锁 ReadWriteLock 原子性长整型 AtomicLong,原子性引用型 AtomicReference 修改数据: 一 服务端修改数据: 一 文章知识点与官方知识档案匹配,可进一步学习相关...
在JUC中,`java.util.concurrent.locks.ReadWriteLock`接口定义了读写锁,而`ReentrantReadWriteLock`是其具体实现,它支持可重入特性,意味着持有读锁的线程可以再次获取读锁,持有写锁的线程可以获取读锁或写锁。...
在Java中,`java.util.concurrent.locks.ReadWriteLock`接口定义了读写锁,`ReentrantReadWriteLock`类实现了这一接口。 6. **CountDownLatch**:这是一个计数器,可以用于让一个线程等待其他线程完成操作。在初始...
在IT行业中,尤其是在软件开发领域,同步锁设计是多线程编程中的一个重要概念,用于确保在并发环境下数据的一致性和完整性。"层次业务模型的同步锁设计"这一主题聚焦于如何在复杂的业务逻辑中,利用同步机制来管理...
在现代软件开发中,尤其是并发编程领域,读写锁(ReadWriteLock)是一种非常重要的同步工具,它允许多个线程同时进行读操作,但只允许一个线程进行写操作,从而在保证数据一致性的同时,提高了系统的并发性能。...
在操作系统课程设计中,常常会涉及到多线程同步与互斥的问题,其中"读者写者问题"是一个经典的并发控制问题,旨在解决多个读者和一个写者如何共享同一数据资源,确保数据的一致性。 读者写者问题是这样设定的:多个...