文档章节

ReentrantReadWriteLock读写互斥lock cache技术实现

小乞丐
 小乞丐
发布于 2013/09/05 23:02
字数 223
阅读 157
收藏 0
<!-- 
package cn.test;

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

public class CacheDemo {
	private final ReadWriteLock rwl = new ReentrantReadWriteLock(); //读写锁
	private final Lock rl = rwl.readLock();
	private final Lock wl = rwl.writeLock();
	private  Map<String, Object> cache = new HashMap<String, Object>();
	public static void main(String[] args) {
		final CacheDemo support = new CacheDemo();  
		for(int j=0;j<10;j++){ //写入
			final String key= "key"+j;
			new Thread(new Runnable() {
				public void run() {
					support.put(key,key);
				}
			}).start();
			new Thread(new Runnable() { //读取
				public void run() {
					support.getData(key);
				}
			}).start();
		}
	}
	//取
	public  Object getData(String key){
		rl.lock();
		System.out.println("开始读取缓存数据....."+Thread.currentThread().getName());
		Object value = null;
		try{
			value = cache.get(key);
			if(value == null){
				rl.unlock();
				wl.lock();
				try{
					if(value==null){
						value = "no";//实际失去queryDB();
					}
				}finally{
					wl.unlock();
				}
				rl.lock();
			}
			System.out.println(Thread.currentThread().getName()+"-- 读 : {key:"+key+",value: "+value+"}");
		}finally{
			System.out.println("结束读取缓存数据....."+Thread.currentThread().getName());
			rl.unlock();
		}
		return value;
	}
	//存
	public void put(String key,Object value){
		wl.lock();
		System.out.println("开始写入缓存数据....."+Thread.currentThread().getName());
		try{
			Thread.sleep(1000);
			if(key != null){
				cache.put(key, value);
			}
			System.out.println(Thread.currentThread().getName()+"-- 写 :  {key:"+key+",value: "+value+"}");
		} catch (InterruptedException e) {
			e.printStackTrace();
		}finally{
			System.out.println("结束写入缓存数据....."+Thread.currentThread().getName());
			wl.unlock();
		}
		
	}
}

-->

© 著作权归作者所有

上一篇: oschina马克杯
下一篇: 位运算操作
小乞丐

小乞丐

粉丝 10
博文 6
码字总数 2120
作品 0
成都
高级程序员
私信 提问
java线程:互斥锁与读写锁

两种互斥锁机制: 1、synchronized 2、ReentrantLock ReentrantLock是jdk5的新特性,采用ReentrantLock可以完全替代替换synchronized传统的锁机制,而且采用ReentrantLock的方式更加面向对象...

_______-
2016/09/02
61
0
ReadWriteLock读写锁

读写锁,分场景优化,提升性能。 读写锁遵守的基本原则: 允许多个线程同时读共享变量。 只允许一个线程写共享变量。 如果一个写线程正在执行写操作,此时禁止多线程读共享变量。 读锁与写锁是...

刘一草
09/23
22
0
第四章-java多线程核心技术-Lock锁-第三篇

Condition实现顺序运行 使用condition对象可以对线程业务进行规划和排序。请看如下代码 输出结果 读写锁的产生 ReentrantLock锁是完全互斥的锁,即同一时间内只有一个线程执行锁后面的方法,...

简心
2018/09/06
23
2
【多线程】ReentrantReadWriteLock读写锁

一、前言 读写锁ReentrantReadWriteLock,其核心就是实现读写分离的锁,在高并发访问下,尤其是读多写少的情况下,性能要远高于重入锁。之前学synchronized、ReentrantLock时,同一时间内,只...

qq_26545305
2018/02/04
0
0
Java多线程学习(九)

在JDK1.5中新增加了ReentrantLock类页能够实现同步的效果,而且在扩张功能上也更加强大,使用上也更加方便。 ReentrantLock 首先先看一下ReentrantLock的方法: 然后来看一个ReentrantLock的...

kakayang2011
2016/03/09
64
0

没有更多内容

加载失败,请刷新页面

加载更多

java通过ServerSocket与Socket实现通信

首先说一下ServerSocket与Socket. 1.ServerSocket ServerSocket是用来监听客户端Socket连接的类,如果没有连接会一直处于等待状态. ServetSocket有三个构造方法: (1) ServerSocket(int port);...

Blueeeeeee
今天
6
0
用 Sphinx 搭建博客时,如何自定义插件?

之前有不少同学看过我的个人博客(http://python-online.cn),也根据我写的教程完成了自己个人站点的搭建。 点此:使用 Python 30分钟 教你快速搭建一个博客 为防有的同学不清楚 Sphinx ,这...

王炳明
昨天
5
0
黑客之道-40本书籍助你快速入门黑客技术免费下载

场景 黑客是一个中文词语,皆源自英文hacker,随着灰鸽子的出现,灰鸽子成为了很多假借黑客名义控制他人电脑的黑客技术,于是出现了“骇客”与"黑客"分家。2012年电影频道节目中心出品的电影...

badaoliumang
昨天
15
0
很遗憾,没有一篇文章能讲清楚线程的生命周期!

(手机横屏看源码更方便) 注:java源码分析部分如无特殊说明均基于 java8 版本。 简介 大家都知道线程是有生命周期,但是彤哥可以认真负责地告诉你网上几乎没有一篇文章讲得是完全正确的。 ...

彤哥读源码
昨天
16
0
jquery--DOM操作基础

本文转载于:专业的前端网站➭jquery--DOM操作基础 元素的访问 元素属性操作 获取:attr(name);$("#my").attr("src"); 设置:attr(name,value);$("#myImg").attr("src","images/1.jpg"); ......

前端老手
昨天
7
0

没有更多内容

加载失败,请刷新页面

加载更多

返回顶部
顶部