`

jdk1.5——readLock/writeLock

 
阅读更多

 

 

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 脑图:

 



 

 

  • 大小: 15.5 KB
分享到:
评论

相关推荐

    jdk1.5 windows版本 64位

    此外,JDK 1.5还引入了新的编译器——Client Compiler和Server Compiler,根据不同的场景选择合适的编译策略,提升代码执行速度。 总结,JDK 1.5的64位Windows版本为Java开发者提供了在64位系统上开发和运行Java...

    jdk1.5x64位 windows版.zip

    JDK1.5是Java的一个重要版本,它在2004年9月30日正式发布,也被称为Java 5.0。这个版本引入了大量的新特性,对Java平台进行了重大改进,提升了开发效率和性能。 首先,JDK1.5引入了类型安全的枚举(enum),这是对...

    最新最全最好用的JDK1.5/5.0/1.6中文版(全译)下载地址

    根据提供的标题、描述、标签及部分内容,我们可以了解到这篇文章主要提供了JDK 1.5/5.0/1.6三个版本的中文文档下载链接。这些文档以CHM格式提供,分别对应不同版本的JDK,并且是经过完整翻译的中文版。下面我们将...

    linux系统jdk1.5下载

    Linux系统中的JDK1.5是Java开发工具包的一个早期版本,主要针对Java语言的编译、运行和调试提供支持。这个版本在今天已经相对较为罕见,因为Java已经有了多个后续版本,包括JDK7、JDK8、JDK9直至最新的JDK17等。然而...

    Java-jdk1.5安装包

    JDK1.5,也称为Java 5.0,是一个重要的版本,它引入了许多新的特性和改进,对Java语言的发展产生了深远影响。 一、泛型(Generics) 在Java 5.0中,最重要的特性之一就是泛型的引入。泛型允许开发者在定义类、接口...

    jdk1.5 windows 64位官方正式版,绝对有效

    JDK1.5,也被称为Java SE 5.0,是一个重要的版本,它引入了许多创新特性,对于Java的发展历程具有深远的影响。 在JDK1.5中,最重要的变化之一是引入了泛型。泛型允许在定义类、接口和方法时指定类型参数,从而增强...

    JDK1.5,JDK1.5

    JDK1.5,全称Java Development Kit 1.5,是Java平台标准版(Java SE)的一个重要版本,由Sun Microsystems在2004年9月30日正式发布。这个版本引入了大量的新特性,对Java编程语言进行了重大改进,极大地提升了开发...

    JDK1.5的32位和64位安装包

    JDK1.5,全称Java Development Kit 1.5,是Java编程语言的一个重要版本,由Oracle公司发布。这个版本在Java的历史上具有里程碑意义,因为它引入了许多新特性和改进,大大提升了开发效率和代码质量。在本文中,我们将...

    jdk1.5 windows 64位官方正式版

    **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.exe jdk1.5 jdk1.5下载

    jdk1.5免安装版

    绝版jdk1.5,非常不错的资源。用起来很好。是 Java语言对Bean类属性、事件的一种缺省处理方法。例如类A中有属性name,那我们可以通过getName,setName来得到其值或者设置新 的值。通过getName/setName来访问name属性,...

    简单易用通用(xls,xlsx)导入导出操作 jdk1.5+

    前几天上传过这个资源,因为是在jdk1.6上开发的, 测试了一下在jdk1.5上不能用, 今天重新用jdk1.5编译了一下, 这个是可以支持jdk1.5+的 将 pu-xlscommon-1.0.0.jar 添加到工程的 /lib 目录下 用法在附件中 XlsTest....

    包含 jdk1.5免安装、jdk1.6免安装、jdk1.8(32和64)

    这个压缩包包含了三个不同版本的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_jdk1.5_Guide.zip_IBM jdk 1.5_aix_ibm java1.5_ibm jdk1.5 wind

    IBM JDK 1.5,全称为IBM Java Development Kit 1.5,是IBM公司为AIX操作系统提供的一个Java运行环境,特别针对AIX平台进行了优化和定制。在AIX系统中进行开发工作时,IBM JDK 1.5扮演着至关重要的角色,因为它提供了...

    JDK1.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...

    window JDK1.5 32位 绿色免安装版,可以安装多个JDK使用

    **Java Development Kit (JDK) 1.5 32位版详解** JDK(Java Development Kit)是Oracle公司提供的用于开发和运行Java应用程序的重要工具集。标题中的"window JDK1.5 32位 绿色免安装版"指的是适用于Windows操作系统...

    jdk 1.5 linux (共三个文件)之一

    测试可用的linux版jdk1.5,jdk-1_5_0_19-linux-i586-rpm.bin

    详细介绍JDK1.5的各种新特性

    **JDK1.5**,又称为Java Development Kit的第5个主要版本,标志着Java语言的一个重大里程碑。这个版本引入了一系列创新性特性和改进,极大地提升了开发效率和代码的可读性,为Java编程带来了全新的体验。以下是JDK...

    JDK1.5版本免费下载

    本资源提供的是JDK 1.5版本的32位安装包,适用于那些仍然需要支持较旧系统或者特定项目需求的开发者。 JDK 1.5,也被称为Java SE 5.0,于2004年9月30日正式发布,是Java发展历程中的一个重要里程碑。这个版本引入了...

    IBMJDK1.5linux.zip

    IBM JDK 1.5 for Linux 64位是一款专为Linux操作系统设计的Java开发工具包,由IBM公司提供。此版本的JDK是基于Java Development Kit(JDK)1.5,也称为Java 5.0,它在Java平台标准版(Java SE)的历史上是一个重要的...

Global site tag (gtag.js) - Google Analytics