`

jdk1.5读写锁技术的妙用

阅读更多
/**
 * ReadWriteLockTest.java
 * cn.com.songjy.test.socket.thread
 * Function: TODO 
 *
 *   version    date      author
 * ──────────────────────────────────
 *   	1.0	 2013-8-19    songjy
 *
 * Copyright (c) 2013, TNT All Rights Reserved.
 */

package cn.com.songjy.test.socket.thread;

import java.util.HashMap;
import java.util.Map;
import java.util.Random;
import java.util.concurrent.locks.ReadWriteLock;
import java.util.concurrent.locks.ReentrantReadWriteLock;

import org.apache.commons.logging.Log;
import org.apache.commons.logging.LogFactory;

/**
 * ClassName:ReadWriteLockTest 
 * jdk1.5读写锁技术的妙用
 * 
 * @author songjy
 * @version 1.0
 * @since v1.0
 * @Date 2013-8-19 下午9:11:37
 */

public class ReadWriteLockTest {

	private Log log = LogFactory.getLog(ReadWriteLockTest.class);

	public static void main(String[] args) {

		final Queue queue = new Queue();
		for (int i = 0; i < 3; i++) {
			new Thread() {
				public void run() {
					while (true) {
						queue.get();
					}
				}

			}.start();

			new Thread() {
				public void run() {
					while (true) {
						queue.put(new Random().nextInt(10000));
					}
				}

			}.start();
		}

	}

	/* 缓存模拟 */
	final ReadWriteLock rwl = new ReentrantReadWriteLock();
	Map<String, Object> cache = new HashMap<String, Object>();

	public Object getData(String key) {

		rwl.readLock().lock();// 上读锁
		Object obj = null;

		try {
			obj = cache.get(key);
			if (null == obj) {
				rwl.readLock().unlock();// 开读锁
				rwl.writeLock().lock();// 上写锁
				try {
					if (null == obj) {// 为啥还要判断一次呢,去掉本行判断难道会影响业务逻辑吗,答案是否定,去掉不会影响业务逻辑, 但该判断是必须的,是为了提高程序性能!原因是当2(多)个线程同时执行到了75行,则第一个线程上写锁并写入数据,第二个线程就阻塞,第一个线程接着开写锁上读锁,当最后开读锁完毕时,第二个线程马上进行上写锁,并再次写入数据,这时发生了不必要的第二次数据写入,因为第一次已经写入了,若有if (null == obj)的判断就不会发生第二次写数据的重复写入!
						obj = "obj";// 通常是去查询数据库等操作
					}
				} catch (Exception e) {
					log.error(e.getMessage(), e);
				} finally {
					rwl.writeLock().unlock();// 开写锁
				}
				rwl.readLock().lock();// 上读锁
			}
		} catch (Exception e) {
			log.error(e.getMessage(), e);
		} finally {
			rwl.readLock().unlock();// 开读锁
		}
		return obj;
	}

}

class Queue {
	private Log log = LogFactory.getLog(Queue.class);
	private Object data = null;// 共享数据,只能有一个线程能写该数据,但可以有多个线程同时读该数据。
	private ReadWriteLock rwl = new ReentrantReadWriteLock();

	public void get() {
		rwl.readLock().lock();
		try {
			log.info(Thread.currentThread().getName()
					+ " be ready to read data!");
			Thread.sleep((long) (Math.random() * 1000));
			log.info(Thread.currentThread().getName() + "have read data :"
					+ data);
		} catch (InterruptedException e) {
			log.error(e.getMessage(), e);
		} finally {
			rwl.readLock().unlock();
		}
	}

	public void put(Object data) {

		rwl.writeLock().lock();
		try {
			log.info(Thread.currentThread().getName()
					+ " be ready to write data!");
			Thread.sleep((long) (Math.random() * 1000));
			this.data = data;
			log.info(Thread.currentThread().getName() + " have write data: "
					+ data);
		} catch (InterruptedException e) {
			log.error(e.getMessage(), e);
		} finally {
			rwl.writeLock().unlock();
		}

	}
}


来自:http://down.51cto.com/data/443434
分享到:
评论

相关推荐

    jdk1.5 windows版本 64位

    标题:“jdk1.5 windows版本 64位” 描述:“jdk1.5 windows版本 64位,Java开发依赖环境” 标签:“windows” 在这个主题中,我们聚焦的是Oracle JDK 1.5(也被称为Java Development Kit,简称JDK)在Windows...

    jdk1.5x64位 windows版.zip

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

    linux系统jdk1.5下载

    3. **安装JDK**:使用RPM命令来安装JDK1.5: ``` sudo rpm -ivh jdk-1_5_0_22-linux-amd64.rpm ``` 4. **配置环境变量**:安装完成后,需要将JDK的路径添加到系统的`PATH`环境变量中。打开或创建`~/.bashrc`或`/...

    Java-jdk1.5安装包

    在JDK1.5中,开发者可以在方法签名中使用省略号(...)表示可变参数。这允许方法接受任意数量的相同类型的参数,如: ```java public void printNumbers(int... nums) { // 代码块 } ``` 这个方法可以接收一个或多...

    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属性,...

    JDK1.5,JDK1.5

    泛型是JDK1.5最重要的特性之一,它允许在类、接口和方法声明中使用类型参数,以实现数据类型的参数化。泛型提高了代码的类型安全性和可读性,减少了类型转换的需要,并允许编译器检查类型错误。 2. **自动装箱与...

    包含 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年发布,引入了许多重要的新特性,如...

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

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

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

    标题中的"window JDK1.5 32位 绿色免安装版"指的是适用于Windows操作系统的32位版本的JDK 1.5,它是一个便携式版本,无需正式安装即可使用。这种绿色免安装版通常是为了方便开发者在不同机器间快速切换工作环境,或...

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

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

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

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

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

    linux下JDK1.5

    本文将深入探讨Linux下JDK1.5的相关知识点,帮助用户更好地理解和使用这个版本的Java开发环境。 首先,安装JDK1.5在Linux系统中通常涉及以下步骤: 1. **下载**:你需要从Oracle官方网站或者第三方镜像站点下载...

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

    另外,JDK1.5还对I/O流进行了改进,引入了NIO(非阻塞I/O)框架,提供了通道(Channels)和缓冲区(Buffers)的概念,提高了读写操作的效率,尤其适用于高并发的网络应用。 总的来说,JDK1.5对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)的历史上是一个重要的...

    JDK1.5、JDK5下载

    JDK1.5,也被称为JDK 5.0,是一个重要的版本,它引入了许多创新特性,显著提升了开发效率和代码质量。这个版本在2004年发布,是Java发展历程中的一个里程碑。 JDK1.5的主要新特性包括: 1. **泛型(Generics)**:...

    历史版本JDK1.5安装包

    8. 遗留的和已删除的特性:JDK 1.5还移除了一些过时的API,如Vector和Hashtable,鼓励开发者使用更加线程安全的ArrayList和HashMap。 9. 类依赖性管理:通过引入ServiceLoader,可以方便地加载实现特定接口的类,...

    jdk jdk1.5 windows系统

    JDK1.5,也被称为Java SE 5.0,是Oracle公司于2004年发布的一个重大更新,带来了许多重要的新特性、改进和优化。以下是对这个版本的一些关键知识点的详细解释: 1. **泛型(Generics)**:JDK1.5引入了泛型,使得...

    jdk1.5、1.6压缩包

    本压缩包包含了JDK的两个重要版本:1.5(也称为Java 5)和1.6(Java 6),这两个版本在历史上对Java社区有着深远的影响。 JDK 1.5(2004年发布)是Java发展的一个重要里程碑,引入了许多新特性,极大地提升了开发...

Global site tag (gtag.js) - Google Analytics