`
xly_971223
  • 浏览: 1288059 次
  • 性别: 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();
	}

}
分享到:
评论

相关推荐

    java多线程设计模式

    4. **读写锁(Read-Write Lock)** Java的ReentrantReadWriteLock提供了读写锁机制,允许多个读线程同时访问共享资源,但只有一个写线程可以进行写操作。这提高了并发性能,降低了锁的粒度。 5. **单例模式与线程...

    design pattern设计模式范例

    在"concurrent"目录下,我们可以找到关于并发编程的设计模式,如线程安全的单例模式实现,或者使用读写锁(Read-Write Lock)来优化多线程环境下的数据访问。并发设计模式是现代多核处理器环境下不可或缺的知识,...

    良葛格DesignPattern学习笔记

    - **Read-Write Lock**(读写锁模式):允许多个读取线程同时访问资源,但只允许一个写入线程访问资源。 - **Thread-Per-Message**(每消息一线程模式):为每个新到达的消息创建一个新的线程。 - **Future**(未来...

    Design patterns for concurent objects

    **读写锁模式(Read-Write Lock Pattern):** 读写锁是一种特殊的锁,它允许多个读取者同时访问共享资源,但在任何时刻只允许一个写入者访问。这提高了程序的并发性,因为多个读取者可以同时进行读操作而不会互相...

    北京一家JAVA开发公司面试题

    - **读写锁(Read/Write Lock)**:允许多个线程同时读取共享资源,但在写入时只允许一个线程访问。 - **生产者-消费者模式**:用于解决线程之间数据传递的问题,其中有一个缓冲区,生产者线程向缓冲区添加数据,...

Global site tag (gtag.js) - Google Analytics