Java-ReentrantReadWriteLock的简单例子

原创 2015年07月07日 20:42:41

内容:读锁时共享的,写锁时互斥的(可见运行结果),都是通过AQS实现的。

public class ReentrantReadWriteLockTest {
	
	static class MyObject {
		private Object object;
		private ReadWriteLock lock = new ReentrantReadWriteLock();
		
		public void get() {
			lock.readLock().lock();
			System.out.println(Thread.currentThread().getName() + "准备读数据!!");
			
			try {
				Thread.sleep(new Random().nextInt(1000));
				System.out.println(Thread.currentThread().getName() + "读数据为:" + this.object);
			} catch (InterruptedException e) {
				e.printStackTrace();
			} finally {
				lock.readLock().unlock();
			}
		}
		
		public void put(Object object) {
			lock.writeLock().lock();
			System.out.println(Thread.currentThread().getName() + "准备写数据");
			
			try {
				Thread.sleep(new Random().nextInt(1000));
				this.object = object;
				System.out.println(Thread.currentThread().getName() + "写数据为" + this.object);
			} catch (InterruptedException e) {
				e.printStackTrace();
			} finally {
				lock.writeLock().unlock();
			}
		}
	}
	
	public static void main(String[] args) throws InterruptedException {
		final MyObject myObject = new MyObject();
		ExecutorService executor = Executors.newCachedThreadPool();
		
		for (int i = 0; i < 3; i++) {
			executor.execute(new Runnable() {
				
				@Override
				public void run() {
					for (int j = 0; j < 5; j++)
						myObject.put(new Random().nextInt(1000));
				}
			});
		}
		
		for (int i = 0; i < 3; i++) {
			executor.execute(new Runnable() {
				
				@Override
				public void run() {
					for (int j = 0; j < 5; j++)
						myObject.get();
				}
			});
		}
		
		executor.shutdown();
	}

}


运行结果:



java 中 ReentrantReadWriteLock的读锁和写锁的使用

jdk文档中关于ReentrantReadWriteLock类使用的一个很好的例子,以下是具体的介绍:    在使用某些种类的 Collection 时,可以使用 ReentrantReadWri...

关于ReentrantReadWriteLock两个问题及解决心得(转)

前些时候写了一个简单的cache类,实现了一些基本的功能:get和update操作。由于使用在多线程的环境中,为了提高效率,我采用了ReadWriteLock,毕竟我这里缓存更新少,取数据多。特别是一...
  • infsafe
  • infsafe
  • 2011年05月19日 17:37
  • 4096

Android并发编程之如何使用ReentrantReadWriteLock替代synchronized来提高程序的效率

Java的synchronized关键字可以帮助我们解决多线程并发的问题,比如我们有一个公共资源,多个线程都来操作这个公共的资源,就会出现并发的问题,比如不同的线程对同一个数据同时进行读和写,肯定会使...

Java多线程(十)之ReentrantReadWriteLock深入分析

一、ReentrantReadWriteLock与ReentrantLock   说到ReentrantReadWriteLock,首先要做的是与ReentrantLock划清界限。它和...

java线程系列---读写锁ReentrantReadWriteLock

获取顺序 此类不会将读取者优先或写入者优先强加给锁定访问的排序。但是,它确实支持可选的公平 策略。当公平地构造线程时,线程利用一个近似到达顺序的策略来争夺进入。当释放写入锁定后,将写入锁定分配给等待...

[java并发]读写锁ReentrantReadWriteLock里面的FairSync 和 NonfairSync

背景介绍 最近转行做java后台了,对于java的并发完全不熟悉,于是到网上各种搜资料。 接到的一个任务是一个很简单从数据库里面读取一些表到内存里面,然后做一个缓存。 读数据库用的EJB3的En...

java 共享锁和ReentrantReadWriteLock

ReadWriteLock 和 ReentrantReadWriteLock介绍ReadWriteLock,顾名思义,是读写锁。它维护了一对相关的锁 — — “读取锁”和“写入锁”,一个用于读取操作,...

Java多线程探究-读写锁ReentrantReadWriteLock

读写锁实际是一种特殊的自旋锁,它把对共享资源的访问者划分成读者和写者,读者只对共享资源进行读访问,写者则需要对共享资源进行写操作。这种锁相对于自旋锁而言,能提高并发性,因为在多处理器系统中,它允许同时...

Java多线程(十)之ReentrantReadWriteLock深入分析

一、ReentrantReadWriteLock与ReentrantLock   说到ReentrantReadWriteLock,首先要做的是与ReentrantLock划清界...

JAVA多线程-Lock的使用(四)-读写锁ReentrantReadWriteLock

读写锁ReentrantReadWriteLock      我们之前讲解的ReentrantLock具有完全互斥排他的效果,即同一时间只有一个线程在执行lock()方法后面的任务。这样做虽然保证了...
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:Java-ReentrantReadWriteLock的简单例子
举报原因:
原因补充:

(最多只允许输入30个字)