Java Concurrency - ReadWriteLock & ReentrantReadWriteLock
锁所提供的最重要的改进之一就是 ReadWriteLock 接口和它的实现类 ReentrantReadWriteLock。这个类提供两把锁,一把用于读操作和一把用于写操作。同一时间可以有多个线程执行读操作,但只有一个线程可以执行写操作。当一个线程正在执行一个写操作,不可能有任何线程执行读操作。
public class VisitCounter {
private ReadWriteLock lock;
private long counter;
public VisitCounter() {
counter = 0;
lock = new ReentrantReadWriteLock();
}
public long get() {
long result = -1;
lock.readLock().lock();
try {
// System.out.println(Thread.currentThread().getName() + "准备查询访客计数器……" + ", " + new Date());
result = queryCounter();
// System.out.println(Thread.currentThread().getName() + "查得访客计数器值为" + result + ", " + new Date());
} catch (Exception e) {
e.printStackTrace();
} finally {
lock.readLock().unlock();
}
return result;
}
public void increase() {
lock.writeLock().lock();
try {
// System.out.println("新增访客:" + Thread.currentThread().getName() + ", " + new Date());
updateCounter();
// System.out.println(Thread.currentThread().getName() + "更新访客计数器完毕……" + ", " + new Date());
} catch (Exception e) {
e.printStackTrace();
} finally {
lock.writeLock().unlock();
}
}
private long queryCounter() throws Exception {
Thread.sleep((long)(Math.random() * 10000));
return counter;
}
private void updateCounter() throws Exception {
Thread.sleep((long)(Math.random() * 10000));
counter++;
}
}
正如前面提及到的,ReentrantReadWriteLock 类有两把锁,一把用于读操作,一把用于写操作。用于读操作的锁,是通过在 ReadWriteLock 接口中声明的 readLock() 方法获取的。这个锁是实现 Lock 接口的一个对象,所以我们可以使用 lock(),unlock() 和 tryLock() 方法。用于写操作的锁,是通过在 ReadWriteLock 接口中声明的 writeLock() 方法获取的。这个锁是实现 Lock 接 口的一个对象,所以我们可以使用 lock(),unlock() 和 tryLock() 方法。确保正确的使用这些锁,使用它们与被设计的目的是一样的,这是程序员的职责。当获得 Lock 接口的读锁时,不能修改变量的值。否则,可能会有数据不一致的错误。
Java Concurrency - ReadWriteLock & ReentrantReadWriteLock的更多相关文章
- 《Java Concurrency》读书笔记,使用JDK并发包构建程序
1. java.util.concurrent概述 JDK5.0以后的版本都引入了高级并发特性,大多数的特性在java.util.concurrent包中,是专门用于多线并发编程的,充分利用了现代多处 ...
- 深入浅出 Java Concurrency (15): 锁机制 part 10 锁的一些其它问题
主要谈谈锁的性能以及其它一些理论知识,内容主要的出处是<Java Concurrency in Practice>,结合自己的理解和实际应用对锁机制进行一个小小的总结. 首先需要强调的 ...
- 深入浅出 Java Concurrency (15): 锁机制 part 10 锁的一些其它问题[转]
主要谈谈锁的性能以及其它一些理论知识,内容主要的出处是<Java Concurrency in Practice>,结合自己的理解和实际应用对锁机制进行一个小小的总结. 首先需要强调的一点 ...
- Java Concurrency in Practice 读书笔记 第十章
粗略看完<Java Concurrency in Practice>这部书,确实是多线程/并发编程的一本好书.里面对各种并发的技术解释得比较透彻,虽然是面向Java的,但很多概念在其他语言 ...
- Java Concurrency - 浅析 CountDownLatch 的用法
The Java concurrency API provides a class that allows one or more threads to wait until a set of ope ...
- Java Concurrency - 浅析 CyclicBarrier 的用法
The Java concurrency API provides a synchronizing utility that allows the synchronization of two or ...
- Java Concurrency - 浅析 Phaser 的用法
One of the most complex and powerful functionalities offered by the Java concurrency API is the abil ...
- Java Concurrency - 线程执行器
Usually, when you develop a simple, concurrent-programming application in Java, you create some Runn ...
- Java Concurrency - Callable & Future
One of the advantages of the Executor framework is that you can run concurrent tasks that return a r ...
随机推荐
- 转载 C#使用Salt + Hash来为密码加密
转载 http://www.csharpwin.com/csharpspace/13412r9615.shtml (一) 为什么要用哈希函数来加密密码 如果你需要保存密码(比如网站用户的密码),你要考 ...
- ucGUI例程收藏
ucGUI 几个重要例程Demo 按钮的定制 #include <stddef.h> #include <string.h> #include "WM.h&quo ...
- BZOJ 2243: [SDOI2011]染色 (树链剖分+线段树合并)
题目链接:http://www.lydsy.com/JudgeOnline/problem.php?id=2243 树链剖分的点剖分+线段树.漏了一个小地方,调了一下午...... 还是要细心啊! 结 ...
- ACE的包装器
ACE大量运用包装器模式,以期改变面向过程的系统API可视性以及错误处理较难的情况 包装器在若干场合能极大简化代码量,甚至是编码过程 比如ACE_Thread_Mutex 对象创建会自动初始化,很开心 ...
- 【M22】考虑以操作符复合形式(op=)取代其独身形式(op)
1.对于内置类型,x = x+y 与x+=y的结果相同. 2. x=x+y 与 x+=y的结果相同,但二者做的事情差别很大. a.x=x+y做的事情:方法内有个局部对象,值为x+y,返回局部对象,返回 ...
- Java模拟登陆新浪微博抓取数据【转载】
package com.shiyimm.crawler.weibo; import java.io.FileNotFoundException; import java.io.FileReader; ...
- PI-webservice05-SAP调用外部webservice
在用webservice进行数据传输的过程中,SAP系统与.net开发的信息系统之间的数据调用.如何用SAP调用外部的.net系统发布的webservice程序来获取外部的数据,详情请见下文: 1,创 ...
- Codeforces Gym 100338C C - Important Roads tarjan
C - Important RoadsTime Limit: 20 Sec Memory Limit: 256 MB 题目连接 http://acm.hust.edu.cn/vjudge/contes ...
- 获得临时文件目录(Temp文件夹)
C:\Users\ADMINI~1\AppData\Local\Temp\ //GetTempPath获得临时文件目录(Temp文件夹) function TempPath:String;var ...
- PHP实现微博的同步发送(转)
导读:在设计博客类站点时,有时会需要在发布文章时同步发布在微博上.本文阐述了实现该功能的基本方式. 准备工作 作为新浪微博的开发者,需要有身份验证: 个人身份认证的审核,一般一个工作日: 接着是提 ...