缓存的写法 利用读写锁

public class CacheDemo {

private Map<String, Object> cache = new HashMap<String, Object>();

public static void main(String[] args) {

// TODO Auto-generated method stub

}

private ReadWriteLock rwl = new ReentrantReadWriteLock();

public  Object getData(String key){

rwl.readLock().lock();

Object value = null;

try{

value = cache.get(key);

if(value == null){

rwl.readLock().unlock();

rwl.writeLock().lock();

try{

if(value==null){

value = "aaaa";//实际是去queryDB();

}

}finally{

rwl.writeLock().unlock();

}

rwl.readLock().lock();

}

}finally{

rwl.readLock().unlock();

}

return value;

}

}

时间: 2024-10-05 16:48:53

缓存的写法 利用读写锁的相关文章

多线程之使用读写锁ReentrantReadWriteLock实现缓存系统

简单地缓存系统:当有线程来取数据时,如果该数据存在我的内存中,我就返回数据:如果不存在我的缓存系统中,那么就去查数据库,返回数据的同时保存在我的缓存中. 其中涉及到读写问题:当多个线程执行读操作时(都加读锁),如果有数据返回:如果没有数据时,则让第一个读的线程,进行获取数据,然后进行写操作,这时需要第一个线程先释放掉读锁然后加写锁.第一个写完后,在家读锁,其他线程使用时判断,如果存在该数据,在直接过去读取不用加写锁. API上缓存例子如下: class CachedData { Object d

读写锁ReadWriteLock和缓存实例

读写锁:多个读锁不互斥,读锁与些锁互斥,写锁与写锁互斥.即:读的时候不允许写,写的时候不允许读,可以同时读. synchronized关键字和普通的Lock构造的锁,会造成读与读之间的互斥,因此读写锁可提高性能. 例子1:三个线程同时对一个共享数据进行读写. import java.util.Random; import java.util.concurrent.locks.ReadWriteLock; import java.util.concurrent.locks.ReentrantRea

随想录(一种新的读写锁的写法)

[ 声明:版权所有,欢迎转载,请勿用于商业用途.  联系信箱:feixiaoxing @163.com] 做游戏的同学想必对云风很熟悉.这一段时间他开发的skynet和ejoy2d两个软件框架在github上很火.其中skynet是为游戏服务器开发的,可以看成是一个service框架,ejoy2d是一个客户端的代码,内容不多,主要封装了opengl的一些接口,很多人不一定看得上. 我对游戏服务器不熟,但是服务器的相关代码还是看了一些的.之前vsftpd.redis.sshd.mysqld的代码也

Java缓存和读写锁

先说最常见的一道面试题: hibernate 中的load()方法和get()方法的区别 用这些代码解释最好 User user = session.load(id,User.class);        User user = session.load(id,User.class);        //缓存代理        User$Proxy extends User{            private Integer id = id;            User realUser

JAVA 并发编程-读写锁之模拟缓存系统(十一)

在多线程中,为了提高效率有些共享资源允许同时进行多个读的操作,但只允许一个写的操作,比如一个文件,只要其内容不变可以让多个线程同时读,不必做排他的锁定,排他的锁定只有在写的时候需要,以保证别的线程不会看到数据不完整的文件.这时候就需要使用读写锁. /** * 简单读写锁demo * @author hejingyuan * */ public class ReadWriteLockTest { public static void main(String[] args) { final Queu

Java-No.06 读写锁控制缓存失效照成的Dogpile效应

package cn.guagua.mobile.common; import java.util.concurrent.locks.Lock; import java.util.concurrent.locks.ReadWriteLock; import java.util.concurrent.locks.ReentrantReadWriteLock; import org.apache.log4j.Logger; import cn.guagua.mobile.cache.redis.Re

锁,同步,可重入锁,读写锁(转)

1.synchronized 把代码块声明为 synchronized,有两个重要后果,通常是指该代码具有 原子性(atomicity)和 可见性(visibility). 1.1 原子性 原子性意味着个时刻,只有一个线程能够执行一段代码,这段代码通过一个monitor object保护.从而防止多个线程在更新共享状态时相互冲突. 1.2 可见性 可见性则更为微妙,它要对付内存缓存和编译器优化的各种反常行为.它必须确保释放锁之前对共享数据做出的更改对于随后获得该锁的另一个线程是可见的 . 作用:

读写锁:ReadWriteLock

http://my.oschina.net/20076678/blog/173165 一.在JDK文档中关于读写锁的相关说明 ReadWriteLock 维护了一对相关的 锁 ,一个用于只读操作,另一个用于写入操作.只要没有 writer, 读取锁 可以由多个 reader 线程同时保持. 写入锁 是独占的.  所有 ReadWriteLock 实现都必须保证 writeLock 操作的内存同步效果也要保持与相关 readLock 的联系.也就是说,成功获取读锁的线程会看到写入锁之前版本所做的所

java并发锁ReentrantReadWriteLock读写锁源码分析

1.ReentrantReadWriterLock基础 所谓读写锁,是对访问资源共享锁和排斥锁,一般的重入性语义为 如果对资源加了写锁,其他线程无法再获得写锁与读锁,但是持有写锁的线程,可以对资源加读锁(锁降级):如果一个线程对资源加了读锁,其他线程可以继续加读锁. java.util.concurrent.locks中关于多写锁的接口:ReadWriteLock public interface ReadWriteLock { /** * Returns the lock used for r