ReadWriteLock使得你可以同时具有多个读取者,只要他们都不试图写入即可。如果写锁被其他任务持有,那么任何读取者均不能访问,直至这个写锁被释放为止。
ReadWriteLock能否提高性能是不确定的,取决于数据读取与修改频率相比较的结果,读取和写入操作的时间,竞争的线程数以及是否是多处理器等等。
下面展示了ReadWriteLock最基本的用法。
package concurrency;
//: concurrency/ReaderWriterList.java
import java.util.concurrent.*;
import java.util.concurrent.locks.*;
import java.util.*;
public class ReaderWriterList<T> {
private ArrayList<T> lockedList;
// Make the ordering fair:
private ReentrantReadWriteLock lock = new ReentrantReadWriteLock(true);
public ReaderWriterList(int size, T initialValue) {
lockedList = new ArrayList<T>(Collections.nCopies(size, initialValue));
}
public T set(int index, T element) {
Lock wlock = lock.writeLock();
wlock.lock();
try {
return lockedList.set(index, element);
} finally {
wlock.unlock();
}
}
public T get(int index) {
Lock rlock = lock.readLock();
rlock.lock();
try {
// Show that multiple readers
// may acquire the read lock:
if (lock.getReadLockCount() > 1)
System.out.println(lock.getReadLockCount());
return lockedList.get(index);
} finally {
rlock.unlock();
}
}
public static void main(String[] args) throws Exception {
new ReaderWriterListTest(30, 1);
}
}
class ReaderWriterListTest {
ExecutorService exec = Executors.newCachedThreadPool();
private final static int SIZE = 100;
private static Random rand = new Random(47);
private ReaderWriterList<Integer> list = new ReaderWriterList<Integer>(
SIZE, 0);
private class Writer implements Runnable {
public void run() {
try {
for (int i = 0; i < 20; i++) { // 2 second test
list.set(i, rand.nextInt());
TimeUnit.MILLISECONDS.sleep(100);
}
} catch (InterruptedException e) {
// Acceptable way to exit
}
System.out.println("Writer finished, shutting down");
exec.shutdownNow();
}
}
private class Reader implements Runnable {
public void run() {
try {
while (!Thread.interrupted()) {
for (int i = 0; i < SIZE; i++) {
list.get(i);
TimeUnit.MILLISECONDS.sleep(1);
}
}
} catch (InterruptedException e) {
// Acceptable way to exit
}
}
}
public ReaderWriterListTest(int readers, int writers) {
for (int i = 0; i < readers; i++)
exec.execute(new Reader());
for (int i = 0; i < writers; i++)
exec.execute(new Writer());
}
} /* (Execute to see output) */// :~
程序输出结果如下:
24
25
22
19
17
16
...
...//省略
7
6
5
4
3
Writer finished, shutting down
set()方法获取写锁,get方法获取读锁,并且检查是否有多个线程获取了读锁,如果是就打印这种读取者的数量到控制台,以证明可以有多个读取者获得读锁。
分享到:
相关推荐
关于读写锁算法的Java实现及思考,是一个深入探讨了多线程...通过本文的讲解,我们不仅学习到了读写锁的基本概念,也深入探讨了其在Java中的具体应用和自定义实现,这对于提高软件开发中的并发编程能力具有重要意义。
读写锁的基本规则是: * 读读不互斥:多个线程可以同时读取同一个资源 * 读写互斥:读线程和写线程不能同时访问同一个资源 * 写写互斥:多个线程不能同时写入同一个资源 读写锁的优点是允许读读的并发,提高了程序...
Java中提供了`java.util.concurrent.locks.ReadWriteLock`接口来支持这种模式,但在本案例中,我们将模拟实现一个读写锁来理解其基本原理。 1. **读写锁接口定义**: - `Lock`接口:这是基础的锁接口,提供了获取...
这个"java简单的读写文件小程序"很可能是用来演示如何使用Java API进行文件操作的基本概念。下面,我们将深入探讨Java中读取和写入文件的相关知识点。 1. **Java.IO 包**:Java.IO 包提供了所有与输入/输出相关的类...
#### 1.1 读写锁的基本概念 读写锁是一种特殊的锁机制,它可以支持多个线程同时读取共享资源,但在任何时刻只允许一个线程修改这个资源。这种类型的锁非常适合那些读操作远远多于写操作的场景。具体来说: - **读读...
3. **读写锁(ReadWriteLock)**:读写锁也是`java.util.concurrent.locks`的一部分,它为读操作和写操作提供不同的锁。读锁是共享的,允许多个线程同时读取数据;写锁是独占的,一次只有一个线程能写数据。这种设计...
综上所述,Java的IO API提供了丰富的功能来处理文件读写,包括基本的字节流操作和高效的缓冲机制。了解和熟练掌握这些工具是开发Java应用程序的基础。通过实践和理解这些概念,你可以编写出高效且健壮的文件处理代码...
在传统的Java I/O中,我们通常使用InputStream和OutputStream进行文件复制,而这种方式需要不断读写,造成大量的上下文切换,效率较低。NIO通过通道和缓冲区的配合,可以实现批量读写,减少系统调用,从而提高性能。...
本篇文章将深入探讨Java中的文件读写机制,包括基本API的使用、流的概念、异常处理以及实用技巧。 首先,Java提供了一系列的类来支持文件操作,如`java.io.File`用于文件和目录的操作,`java.io.FileReader`、`java...
读写锁:在多线程环境下,读写锁(如Java中的ReentrantReadWriteLock)提供了一种优化方案。它允许多个线程同时读取数据,但仅允许一个线程写入。当写锁被持有时,其他写操作和读操作都会被阻塞,确保数据的一致性。...
5. **其他高级特性**:除了基本的锁功能,Redisson还提供了许多高级特性,如读写锁、公平锁、信号量、原子整数等。你可以根据具体需求选择合适的数据结构。 集成Redission到SpringBoot项目后,我们可以轻松地实现...
在实际项目中,Java并发库提供了`java.util.concurrent.locks.ReentrantReadWriteLock`类,它是一个可重入的读写锁,可以更高效地处理读写冲突,但这里我们选择了一个更基础的实现,以便更好地理解读者写者问题的...
在 Java 中,锁有多种不同的实现机制,如可重入锁、读写锁、互斥锁、悲观锁、乐观锁、公平锁、锁消除、独享锁、共享锁等。 可重入锁 可重入锁,也叫做递归锁,指的是同一线程外层函数获得锁之后,内层递归函数仍然...
java.util.jar 提供读写 JAR (Java ARchive) 文件格式的类,该格式基于具有可选清单文件的标准 ZIP 文件格式。 java.util.logging 提供 JavaTM 2 平台核心日志工具的类和接口。 java.util.prefs 此包允许应用程序...
通过以上介绍,我们可以了解到Oracle数据库中锁的基本概念和分类,以及如何在Java应用程序中利用这些锁来实现对数据的一致性和并发性的控制。合理使用锁能够有效避免数据冲突,提高系统的稳定性和效率。
首先,我们需要了解锁的基本类型:互斥锁(Mutex)和读写锁(Read-Write Lock)。互斥锁提供独占式访问,即一次只允许一个线程访问共享资源,保证了写操作的安全性。而读写锁则进一步区分了读取和写入操作,允许多个...
本篇文章将详细解析Java中如何进行文件读写操作,并通过实例演示不同方式的使用。 首先,Java中的文件读写操作主要用于将内存中的数据持久化存储到文件中,或者从文件中恢复数据到内存。这一过程通常涉及到Java I/O...
在并发控制方面,《Java并发编程实战》可能会探讨不同类型的锁,如互斥锁(Mutex)、读写锁(ReadWriteLock)、乐观锁和悲观锁等,以及它们的应用场景和性能影响。作者可能会使用实例代码来演示如何在实际应用中使用...
常见的解决方案包括使用`synchronized`关键字对关键代码段加锁,或采用`ReentrantLock`等更高级的锁机制。 #### 结语 通过本文的深入探讨,我们不仅理解了Java网络编程的基本原理,还掌握了多线程机制的关键技术。...
在多线程环境中,可能需要使用`java.nio.channels.FileLock`来实现文件的锁,确保多个线程安全地访问同一文件。 9. **编码与解码**: 文件的读写还涉及到字符编码,Java允许指定编码,如UTF-8: ```java ...