锁所提供的最重要的改进之一就是 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的更多相关文章

  1. 《Java Concurrency》读书笔记,使用JDK并发包构建程序

    1. java.util.concurrent概述 JDK5.0以后的版本都引入了高级并发特性,大多数的特性在java.util.concurrent包中,是专门用于多线并发编程的,充分利用了现代多处 ...

  2. 深入浅出 Java Concurrency (15): 锁机制 part 10 锁的一些其它问题

      主要谈谈锁的性能以及其它一些理论知识,内容主要的出处是<Java Concurrency in Practice>,结合自己的理解和实际应用对锁机制进行一个小小的总结. 首先需要强调的 ...

  3. 深入浅出 Java Concurrency (15): 锁机制 part 10 锁的一些其它问题[转]

    主要谈谈锁的性能以及其它一些理论知识,内容主要的出处是<Java Concurrency in Practice>,结合自己的理解和实际应用对锁机制进行一个小小的总结. 首先需要强调的一点 ...

  4. Java Concurrency in Practice 读书笔记 第十章

    粗略看完<Java Concurrency in Practice>这部书,确实是多线程/并发编程的一本好书.里面对各种并发的技术解释得比较透彻,虽然是面向Java的,但很多概念在其他语言 ...

  5. Java Concurrency - 浅析 CountDownLatch 的用法

    The Java concurrency API provides a class that allows one or more threads to wait until a set of ope ...

  6. Java Concurrency - 浅析 CyclicBarrier 的用法

    The Java concurrency API provides a synchronizing utility that allows the synchronization of two or ...

  7. Java Concurrency - 浅析 Phaser 的用法

    One of the most complex and powerful functionalities offered by the Java concurrency API is the abil ...

  8. Java Concurrency - 线程执行器

    Usually, when you develop a simple, concurrent-programming application in Java, you create some Runn ...

  9. Java Concurrency - Callable & Future

    One of the advantages of the Executor framework is that you can run concurrent tasks that return a r ...

随机推荐

  1. 转载Repository 和Unit of work的使用说明

    利用Repository and Unit of Work重构项目 文章索引和简介 项目最基础的东西已经结束了,但是现在我们的项目还不健全  不利于测试 重复性代码多   层与层之间耦合性高  不利于 ...

  2. iOS开发60分钟入门

    原文:https://github.com/qinjx/30min_guides/blob/master/ios.md 本文面向已有其它语言(如Java,C,PHP,Javascript)编程经验的i ...

  3. python crawler0723.py

    #!/usr/env  python #-*- coding: utf-8  -*- import urllib import urllib2 import random import request ...

  4. 《JavaScript高级程序设计》 读书笔记(三)

    操作符 递增和递减操作符 var num1 = 2; var num2 = 20; var num3 = --num1 + num2; // 等于 21 var num4 = num1 + num2; ...

  5. R语言聚类方法&主要软件包-K-means

    主要4中软件包 stas:主要包含基本统计函数. cluster:用于聚类分析. fpc:含聚类算法函数(固定聚类.线性回归聚类等). mclust:处理高斯分布混合模型,通过EM算法实现聚类.分类及 ...

  6. nginx将http重定向到https

    1.rewrite server { listen 80; server_name test.com; rewrite ^(.*)$ https://$host$1 permanent; } 2. n ...

  7. Transaction Manager Maximum Timeout

    TransactionManager.MaximumTimeout是个只读的属性, 默认只有10分钟, 要想修改它必须通过machine.config来修改. 为了单个应用而去修改这个值是不合适的. ...

  8. Android如何判断一个应用在运行

    在一个应用中,或一个Service .Receiver中有时候需要判断一个应用是否正在运行,以便进行一些相关的处理,这个时候我们需要得到一个ActivityManager,这个Manager顾名思意就 ...

  9. 我所经历的SAP选型

    这是一个失败的选型项目,而且在可遇见的未来公司也不会再经历SAP选型,甚至不会再启动erp项目,个中原因很难一言道尽,在此简要的说说我们的选型过程以及在选型过程中对各种因素的考虑. 一.重启选型工作七 ...

  10. 硝烟中的scrum和xp学习笔记 - 怎样编写产品backlog

    产品backlog是scrum的核心,也是一切的起源. 从根本上说,它就是一个需求/故事/特性组成的列表,按照重要性的级别排序. 我们叫它story, 或者backlog(条目). Backlog I ...