`
xly_971223
  • 浏览: 1276909 次
  • 性别: Icon_minigender_1
  • 来自: 北京
社区版块
存档分类
最新评论

多线程之读写锁模式 Read-Write Lock Pattern

    博客分类:
  • java
 
阅读更多
场景:
老师在黑板上写了字,很多学生在下面读
现在老师要擦掉重写,学生们说我们还没看完呢 等我们全部看完了才能擦
这就是读写锁:没有线程读取时才能写入

看程序如何实现吧
看以看到一次完整的读取或者写入要获取两次锁,这也就是加大了读写锁的使用成本
所以读写锁用来处理一些比较耗时的计算更划算

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 lock)

    在Linux系统中,读写锁(Read/Write Locks,简称rwlocks)是一种多线程同步机制,它允许多个线程同时进行读操作,但只允许一个线程执行写操作。这种锁的设计目的是提高并发性能,特别是当读操作远多于写操作时。在...

    易语言线程安全之原子锁与读写锁

    读写锁分为读锁和写锁,读锁可由多个线程同时持有,而写锁是独占的,一旦有线程持有了写锁,其他所有线程都无法再获取读锁或写锁。 读写锁的工作原理如下: 1. 当没有线程持有锁时,任何线程都可以获得写锁。 2. 当...

    多线程(22)读写锁分离模式1

    在多线程编程中,读写锁是一种优化并发访问共享资源效率的重要机制。读写锁分离模式允许多个读取操作并行执行,而写入操作则保持互斥,从而提高系统的整体性能。Java中提供了`java.util.concurrent.locks....

    WINDOWS读写锁实现

    在Windows操作系统中,读写锁(Read-Write Lock)是一种多线程同步原语,它允许多个线程同时读取共享资源,但在写入时仅允许一个线程访问。这提高了并发性能,尤其是在读操作远多于写操作的场景下。本篇文章将深入...

    windows 读写锁 (基于关键区的读写锁类 及自动锁)

    其中,读写锁(Read-Write Lock,简称RWLock)是一种高效的线程同步机制,适用于大量读取操作和少量写入操作的情况。在本文中,我们将深入探讨基于关键区的Windows读写锁类及其自动锁的实现原理和改进点。 读写锁的...

    C#使用读写锁三行代码简单解决多线程并发的问题

    本文通过三行代码展示了如何使用读写锁解决多线程并发写入文件的冲突。 读写锁的核心在于,它允许多个线程同时读取资源,但只允许一个线程写入资源。这样,当多个线程尝试写入时,只有一个线程能够获得写锁,其他...

    用shared_ptr实现多线程对全局变量的读写,copy-on-write技术

    参考陈硕的多线程服务端编程&gt;&gt;,中的用shared_ptr实现copy-on-write技术,不过这里的线程采用的是c++11的线程库

    Windows下读写锁的实现

    在Windows操作系统中,读写锁(Read-Write Lock)是一种多线程同步机制,它允许多个线程同时读取共享资源,但在写入时只允许一个线程进行操作。这提高了并发性能,因为读操作通常是非冲突的。本文将详细讨论如何在...

    多线程文件读写ThreadREADWrite

    为了解决这个问题,我们通常会使用线程同步机制,如互斥量(Mutex)、信号量(Semaphore)或读写锁(Read-Write Lock)。 1. **互斥量**:互斥量是一种独占式同步原语,只有一个线程能持有它。当一个线程获取了互斥...

    C#多线程读写sqlite

    通常,它会展示如何在多个线程中并行执行读写操作,以及如何使用`lock`或其他同步原语来保护对数据库的访问。测试部分可能会比较不同并发策略下的性能差异,如单线程、多线程无锁、多线程带锁等。 总结来说,理解和...

    python多线程同步之文件读写控制

    在Python编程中,多线程同步对于文件读写控制至关重要,因为如果不加以控制,多个线程同时访问同一文件可能会导致数据不一致或者错误。这里我们将深入探讨如何在Python中使用多线程同步来确保文件读写的安全性。 ...

    简单读写锁实例代码

    在C++编程中,读写锁(Read-Write Lock)是一种多线程同步机制,它允许多个线程同时读取共享资源,但只允许一个线程写入。这种锁机制提高了对共享数据的并发访问效率,是并发编程中常用的一种工具。本实例将通过代码...

    读写锁实现例子

    在这个例子中,我们讨论了如何使用读写锁(Read-Write Lock)来实现多线程环境中的并发访问控制。读写锁是一种高级的同步机制,它允许多个线程同时读取共享资源,但只允许一个线程进行写操作。这在数据读取远比写入...

    c#多线程读写锁操作

    为了解决这个问题,C#提供了一种名为“读写锁”(ReaderWriterLockSlim)的同步原语,它允许对共享资源进行高效的读写控制,确保了多线程的安全性。本文将深入探讨如何利用读写锁在C#中实现多线程的高效安全资源访问...

    vc++中的线程锁(线程锁保持线程同步)

    在提供的文件列表中,如`RWLock.cpp`,可能涉及到了读写锁(Read-Write Lock),这是一种更为复杂的线程同步机制,允许多个线程同时进行读操作,但只允许一个线程进行写操作,从而提高了并发性能。 `Thread.cpp`和`...

    行业分类-设备装置-读写锁控制方法及装置.zip

    在IT行业中,读写锁(Read-Write Lock)是一种多线程编程中常见的同步机制,用于提高并发性能。它允许多个读者同时访问共享资源,但只允许一个写者独占资源,以避免数据的不一致性。这个压缩包“行业分类-设备装置-...

    java 读写锁代码

    Java 读写锁是Java并发编程中的一种重要机制,它为多线程环境下的数据访问提供了更为精细的控制。在Java的`java.util.concurrent.locks`包中,`ReentrantReadWriteLock`类实现了读写锁的功能。这个锁允许多个读取者...

    e语言-易语言读写锁

    在易语言中,读写锁(Read-Write Lock)是一个重要的同步机制,常用于多线程编程,以确保数据在并发访问时的正确性和一致性。 读写锁的核心思想是区分读操作和写操作,允许多个读取者同时访问资源,但只有单一的...

    一个多线程同步读写的小程序

    在分析这个“read_write”程序时,我们还需要考虑线程安全的数据结构、异常处理以及线程间的通信。例如,线程可能需要处理中断请求,或者在发生错误时能够优雅地关闭。此外,为了调试和性能优化,可能还需要记录日志...

    VC++ 多线程文件读写操作实例

    VC++环境下编写的一个多线程文件读写操作的实例。简单的利用互斥变量、原子操作等技术实现多线程读写文件时的互斥,从而确保文件在操作过程中不会被破坏。例子并没有使用很多复杂的逻辑。适合刚接触多线程编程的新手...

Global site tag (gtag.js) - Google Analytics