场景:
老师在黑板上写了字,很多学生在下面读
现在老师要擦掉重写,学生们说我们还没看完呢 等我们全部看完了才能擦
这就是读写锁:没有线程读取时才能写入
看程序如何实现吧
看以看到一次完整的读取或者写入要获取两次锁,这也就是加大了读写锁的使用成本
所以读写锁用来处理一些比较耗时的计算更划算
public class ReadWriteLock {
private int readerCount = 0; //读取线程数
private int writerCount = 0; //写入线程数
/**
* 获取读锁时:
* 已经有线程在读取 ---获取成功
* 已经有线程在写入---等待
*
* @throws InterruptedException
*/
public synchronized void readLock() throws InterruptedException{
while(writerCount > 0){ //线程正在写
wait(); //读取线程等待
}
readerCount++; //获取读锁成功
}
/**
* 释放读锁
*/
public synchronized void readUnlock(){
readerCount--;
notifyAll();
}
/**
* 获取写锁:
* 读取线程大于0 -- 等待
* 写入线程大于0 -- 等待
*
* @throws InterruptedException
*/
public synchronized void writeLock() throws InterruptedException{
while (readerCount > 0 || writerCount > 0) {
wait();
}
writerCount++;
}
public synchronized void writeUnlock() throws InterruptedException{
writerCount--;
notifyAll();
}
}
package com.justel.fs.rwlock;
/**
*
* @author 徐良永
* @date 2013-6-8下午4:36:22
*/
public class ReaderThread extends Thread {
private Data data;
public ReaderThread(Data data){
this.data = data;
}
public void run(){
try {
for (int i = 0; i < 100; i++) {
System.out.println(Thread.currentThread().getName()+" "+data.read());
Thread.sleep(600);
}
} catch (InterruptedException e) {
e.printStackTrace();
}
}
}
package com.justel.fs.rwlock;
/**
*
* @author 徐良永
* @date 2013-6-8下午4:36:17
*/
public class WriterThread extends Thread {
private Data data;
public WriterThread(Data data){
this.data = data;
}
public void run(){
try {
for (int i = 0; i < 100; i++) {
data.write("Content:" + i);
System.out.println("Write content:" + i);
Thread.sleep(1000);
}
} catch (InterruptedException e) {
e.printStackTrace();
}
}
}
package com.justel.fs.rwlock;
public class Data {
private String content = "INIT";
private ReadWriteLock readWriteLock = new ReadWriteLock();
public String read() throws InterruptedException{
readWriteLock.readLock();
try {
return content;
} finally{
readWriteLock.readUnlock();
}
}
public void write(String s)throws InterruptedException{
readWriteLock.writeLock();
try {
content = s;
} finally{
readWriteLock.writeUnlock();
}
}
}
package com.justel.fs.rwlock;
public class Main {
/**
* @param args
*/
public static void main(String[] args) {
Data data = new Data();
new WriterThread(data).start();
new ReaderThread(data).start();
new ReaderThread(data).start();
new ReaderThread(data).start();
// new ReaderThread(data).start();
// new ReaderThread(data).start();
}
}
分享到:
相关推荐
在Linux系统中,读写锁(Read/Write Locks,简称rwlocks)是一种多线程同步机制,它允许多个线程同时进行读操作,但只允许一个线程执行写操作。这种锁的设计目的是提高并发性能,特别是当读操作远多于写操作时。在...
读写锁分为读锁和写锁,读锁可由多个线程同时持有,而写锁是独占的,一旦有线程持有了写锁,其他所有线程都无法再获取读锁或写锁。 读写锁的工作原理如下: 1. 当没有线程持有锁时,任何线程都可以获得写锁。 2. 当...
在多线程编程中,读写锁是一种优化并发访问共享资源效率的重要机制。读写锁分离模式允许多个读取操作并行执行,而写入操作则保持互斥,从而提高系统的整体性能。Java中提供了`java.util.concurrent.locks....
线程锁是另一种同步工具,包括互斥量(Mutex)、临界区(Critical Section)和读写锁(Read-Write Lock)。这些锁机制用于保护临界区,防止多个线程同时进入,避免数据竞争和不一致。例如,互斥量适用于需要独占访问...
在Windows操作系统中,读写锁(Read-Write Lock)是一种多线程同步原语,它允许多个线程同时读取共享资源,但在写入时仅允许一个线程访问。这提高了并发性能,尤其是在读操作远多于写操作的场景下。本篇文章将深入...
读写锁(Read-Write Lock),也称为共享独占锁,是多线程编程中一种高效的数据同步机制。它允许多个读线程同时访问数据,但只允许一个写线程独占资源,确保数据的一致性。在某些情况下,这种锁能够显著提高并发性能...
其中,读写锁(Read-Write Lock,简称RWLock)是一种高效的线程同步机制,适用于大量读取操作和少量写入操作的情况。在本文中,我们将深入探讨基于关键区的Windows读写锁类及其自动锁的实现原理和改进点。 读写锁的...
本文通过三行代码展示了如何使用读写锁解决多线程并发写入文件的冲突。 读写锁的核心在于,它允许多个线程同时读取资源,但只允许一个线程写入资源。这样,当多个线程尝试写入时,只有一个线程能够获得写锁,其他...
参考陈硕的多线程服务端编程>>,中的用shared_ptr实现copy-on-write技术,不过这里的线程采用的是c++11的线程库
在Windows操作系统中,读写锁(Read-Write Lock)是一种多线程同步机制,它允许多个线程同时读取共享资源,但在写入时只允许一个线程进行操作。这提高了并发性能,因为读操作通常是非冲突的。本文将详细讨论如何在...
为了解决这个问题,我们通常会使用线程同步机制,如互斥量(Mutex)、信号量(Semaphore)或读写锁(Read-Write Lock)。 1. **互斥量**:互斥量是一种独占式同步原语,只有一个线程能持有它。当一个线程获取了互斥...
通常,它会展示如何在多个线程中并行执行读写操作,以及如何使用`lock`或其他同步原语来保护对数据库的访问。测试部分可能会比较不同并发策略下的性能差异,如单线程、多线程无锁、多线程带锁等。 总结来说,理解和...
在Python编程中,多线程同步对于文件读写控制至关重要,因为如果不加以控制,多个线程同时访问同一文件可能会导致数据不一致或者错误。这里我们将深入探讨如何在Python中使用多线程同步来确保文件读写的安全性。 ...
在C++编程中,读写锁(Read-Write Lock)是一种多线程同步机制,它允许多个线程同时读取共享资源,但只允许一个线程写入。这种锁机制提高了对共享数据的并发访问效率,是并发编程中常用的一种工具。本实例将通过代码...
在这个例子中,我们讨论了如何使用读写锁(Read-Write Lock)来实现多线程环境中的并发访问控制。读写锁是一种高级的同步机制,它允许多个线程同时读取共享资源,但只允许一个线程进行写操作。这在数据读取远比写入...
为了解决这个问题,C#提供了一种名为“读写锁”(ReaderWriterLockSlim)的同步原语,它允许对共享资源进行高效的读写控制,确保了多线程的安全性。本文将深入探讨如何利用读写锁在C#中实现多线程的高效安全资源访问...
在提供的文件列表中,如`RWLock.cpp`,可能涉及到了读写锁(Read-Write Lock),这是一种更为复杂的线程同步机制,允许多个线程同时进行读操作,但只允许一个线程进行写操作,从而提高了并发性能。 `Thread.cpp`和`...
在IT行业中,读写锁(Read-Write Lock)是一种多线程编程中常见的同步机制,用于提高并发性能。它允许多个读者同时访问共享资源,但只允许一个写者独占资源,以避免数据的不一致性。这个压缩包“行业分类-设备装置-...
Java 读写锁是Java并发编程中的一种重要机制,它为多线程环境下的数据访问提供了更为精细的控制。在Java的`java.util.concurrent.locks`包中,`ReentrantReadWriteLock`类实现了读写锁的功能。这个锁允许多个读取者...
在分析这个“read_write”程序时,我们还需要考虑线程安全的数据结构、异常处理以及线程间的通信。例如,线程可能需要处理中断请求,或者在发生错误时能够优雅地关闭。此外,为了调试和性能优化,可能还需要记录日志...