1 关于读写锁的一些特点:
a) 读写锁是JVM自己控制的,我们只要上相应方法上加锁即可
b) 多个读锁共享数据/操作
c) 读锁和写锁行为互斥
d) 写锁和写锁行为互斥
2 读写锁应用案例1,
package thread; import java.util.Random; import java.util.concurrent.locks.ReadWriteLock; import java.util.concurrent.locks.ReentrantLock; import java.util.concurrent.locks.ReentrantReadWriteLock; /** * 多线程下 * 写的时候 独占 * 读的时候 共享 分别在对应的方法上 增加 读/写锁,剩下关于独占和共享功能交给jdk5来完成。 * @author zm * */ public class ReadWriteLockExamp { /** * 如下数据说明: 线程在读的时候 没有写行为 同样 线程写时没有读行为 Thread-0 be ready to read data! Thread-0 read the data is 0 Thread-1 be ready to write data! Thread-1 write the data is 1667 Thread-2 be ready to read data! Thread-2 read the data is 1667 Thread-3 be ready to write data! Thread-3 write the data is 6691 Thread-4 be ready to read data! Thread-4 read the data is 6691 Thread-5 be ready to write data! Thread-5 write the data is 6950 Thread-6 be ready to read data! Thread-8 be ready to read data! Thread-6 read the data is 6950 Thread-8 read the data is 6950 Thread-7 be ready to write data! Thread-7 write the data is 1142 Thread-9 be ready to write data! Thread-9 write the data is 331 */ public static void main(String[] args) { final Quene quene = new Quene(); for(int i=0; i<5; i++){ new Thread(new Runnable() { @Override public void run() { quene.readData(); } }).start(); new Thread(new Runnable() { @Override public void run() { quene.writeData(); } }).start(); } } } class Quene { private int data; ReadWriteLock lock = new ReentrantReadWriteLock(); public void readData(){ // 增加读锁 大家都在读数据 为了防止读的过程中别人同时写东西,因此需要加入读锁 try { lock.readLock().lock(); System.out.println(Thread.currentThread().getName() + " be ready to read data!"); Thread.sleep(10); System.out.println(Thread.currentThread().getName() + " read the data is " + data); } catch (Exception e) { e.printStackTrace(); }finally{ lock.readLock().unlock();// 及时关闭 } } public void writeData(){ // 增加写锁 try { lock.writeLock().lock(); System.out.println(Thread.currentThread().getName() + " be ready to write data!"); Thread.sleep(100); data = new Random().nextInt(10000); System.out.println(Thread.currentThread().getName() + " write the data is " + data); } catch (Exception e) { e.printStackTrace(); }finally{ lock.writeLock().unlock(); // 及时关闭 } } }
3 利用读写锁模拟一个缓存系统,
写法参考 API下类 ReentrantReadWriteLock 下 class CachedData {...} 细节自行查找
package thread; import java.util.concurrent.locks.ReadWriteLock; import java.util.concurrent.locks.ReentrantReadWriteLock; public class MyCache { /** * */ public static void main(String[] args) { } } class CacheData { String value = ""; ReadWriteLock lock = new ReentrantReadWriteLock(); public String processCacheData(){ lock.readLock().lock(); try{ if("".equals(value)){// 找不到数据 lock.readLock().unlock();// 放掉读锁,带上写锁(因为读写锁互斥) lock.writeLock().lock();// 当最早的线程加写锁后,其余稍后的并发过来的读线程被互斥等待,直到最先的线程执行到 释放写锁后,才能继续执行后续代码 try{ if("".equals(value)){// 这里必须在又一次非空判断,防止 第一次时并发过来时 重复执行赋值操作 value = "hello hadoop"; // 真实代码为业务逻辑 eg: get user from db } }finally{ lock.writeLock().unlock(); // 写完数据后放弃写锁 } lock.readLock().lock();// 增加读锁,防止稍后线程获取到写锁,执行重写写操作 } }finally{ lock.readLock().unlock(); // 为了防止业务层出现异常,因此所有的释放锁操作都要放在finally执行 } return value; } }
4 读写锁适应的环境:
以下从jdk ReadWriteLock api下部分摘抄:
与互斥锁相比,使用读-写锁所允许的并发性增强将带来更大的性能提高
在实践中,只有在多处理器上并且只在访问模式适用于共享数据时,才能完全实现并发性增强。
如果数据更新变得频繁,数据在大部分时间都被独占锁,这时,就算存在并发性增强,也是微不足道的
如果读取操作所用时间太短,则读-写锁实现(它本身就比互斥锁复杂)的开销将成为主要的执行成本
只有通过分析和测量,才能确定应用程序是否适合使用读-写锁。
总结就是: 仅仅适合于 大量读, 少量写的场合
5 脑图:
相关推荐
此外,JDK 1.5还引入了新的编译器——Client Compiler和Server Compiler,根据不同的场景选择合适的编译策略,提升代码执行速度。 总结,JDK 1.5的64位Windows版本为Java开发者提供了在64位系统上开发和运行Java...
JDK1.5是Java的一个重要版本,它在2004年9月30日正式发布,也被称为Java 5.0。这个版本引入了大量的新特性,对Java平台进行了重大改进,提升了开发效率和性能。 首先,JDK1.5引入了类型安全的枚举(enum),这是对...
根据提供的标题、描述、标签及部分内容,我们可以了解到这篇文章主要提供了JDK 1.5/5.0/1.6三个版本的中文文档下载链接。这些文档以CHM格式提供,分别对应不同版本的JDK,并且是经过完整翻译的中文版。下面我们将...
Linux系统中的JDK1.5是Java开发工具包的一个早期版本,主要针对Java语言的编译、运行和调试提供支持。这个版本在今天已经相对较为罕见,因为Java已经有了多个后续版本,包括JDK7、JDK8、JDK9直至最新的JDK17等。然而...
JDK1.5,也称为Java 5.0,是一个重要的版本,它引入了许多新的特性和改进,对Java语言的发展产生了深远影响。 一、泛型(Generics) 在Java 5.0中,最重要的特性之一就是泛型的引入。泛型允许开发者在定义类、接口...
JDK1.5,也被称为Java SE 5.0,是一个重要的版本,它引入了许多创新特性,对于Java的发展历程具有深远的影响。 在JDK1.5中,最重要的变化之一是引入了泛型。泛型允许在定义类、接口和方法时指定类型参数,从而增强...
JDK1.5,全称Java Development Kit 1.5,是Java平台标准版(Java SE)的一个重要版本,由Sun Microsystems在2004年9月30日正式发布。这个版本引入了大量的新特性,对Java编程语言进行了重大改进,极大地提升了开发...
JDK1.5,全称Java Development Kit 1.5,是Java编程语言的一个重要版本,由Oracle公司发布。这个版本在Java的历史上具有里程碑意义,因为它引入了许多新特性和改进,大大提升了开发效率和代码质量。在本文中,我们将...
**Java Development Kit (JDK) 1.5 Windows 64位官方正式版** JDK 1.5,也称为Java SE 5.0(Java Standard Edition 5.0),是Oracle公司(前身为Sun Microsystems)发布的一个重要的Java开发工具包。这个版本于2004...
jdk1.5.exe jdk1.5 jdk1.5下载
绝版jdk1.5,非常不错的资源。用起来很好。是 Java语言对Bean类属性、事件的一种缺省处理方法。例如类A中有属性name,那我们可以通过getName,setName来得到其值或者设置新 的值。通过getName/setName来访问name属性,...
前几天上传过这个资源,因为是在jdk1.6上开发的, 测试了一下在jdk1.5上不能用, 今天重新用jdk1.5编译了一下, 这个是可以支持jdk1.5+的 将 pu-xlscommon-1.0.0.jar 添加到工程的 /lib 目录下 用法在附件中 XlsTest....
这个压缩包包含了三个不同版本的JDK:JDK 1.5、JDK 1.6和JDK 1.8,其中1.5和1.6是早期版本,而1.8是最流行且广泛使用的版本之一。 **JDK 1.5(也称为Java 5.0)** JDK 1.5在2004年发布,引入了许多重要的新特性,如...
IBM JDK 1.5,全称为IBM Java Development Kit 1.5,是IBM公司为AIX操作系统提供的一个Java运行环境,特别针对AIX平台进行了优化和定制。在AIX系统中进行开发工作时,IBM JDK 1.5扮演着至关重要的角色,因为它提供了...
JDK1.5 全平台安装包下载 百度网盘资源 jdk-1_5_0_22-linux-amd64-rpm.bin jdk-1_5_0_22-linux-amd64.bin jdk-1_5_0_22-linux-i586-rpm.bin jdk-1_5_0_22-linux-i586.bin jdk-1_5_0_22-solaris-amd64...
**Java Development Kit (JDK) 1.5 32位版详解** JDK(Java Development Kit)是Oracle公司提供的用于开发和运行Java应用程序的重要工具集。标题中的"window JDK1.5 32位 绿色免安装版"指的是适用于Windows操作系统...
测试可用的linux版jdk1.5,jdk-1_5_0_19-linux-i586-rpm.bin
**JDK1.5**,又称为Java Development Kit的第5个主要版本,标志着Java语言的一个重大里程碑。这个版本引入了一系列创新性特性和改进,极大地提升了开发效率和代码的可读性,为Java编程带来了全新的体验。以下是JDK...
本资源提供的是JDK 1.5版本的32位安装包,适用于那些仍然需要支持较旧系统或者特定项目需求的开发者。 JDK 1.5,也被称为Java SE 5.0,于2004年9月30日正式发布,是Java发展历程中的一个重要里程碑。这个版本引入了...
IBM JDK 1.5 for Linux 64位是一款专为Linux操作系统设计的Java开发工具包,由IBM公司提供。此版本的JDK是基于Java Development Kit(JDK)1.5,也称为Java 5.0,它在Java平台标准版(Java SE)的历史上是一个重要的...