package endual;
import java.util.HashMap;
import java.util.Map;
import java.util.concurrent.locks.ReadWriteLock;
import java.util.concurrent.locks.ReentrantReadWriteLock;
public class CacheDemo {
/**
* @param args
*/
private Map<String,Object> map = new HashMap<String,Object>();
private ReadWriteLock rwLock = new ReentrantReadWriteLock() ;
public static void main(String[] args) {
}
/**
* 一个缓存储系统
* @param key
* @return
*/
public synchronized Object getData (String key) {
Object obj = map.get(key);
if (null == obj) {
System.out.println("到数据库中去取哦");
try {
Thread.sleep(1000*5) ;
} catch (InterruptedException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
obj = "data from mysql" ;
}
return obj ;
}
/**
* 一个缓存储系统,这个系统还是有问题的,你看出来了么,哈哈哈--------------------------------
* @param key
* @return
*/
public Object getDataUseLock (String key) {
rwLock.readLock().lock() ; //先把读锁给锁上
Object obj = map.get(key);
if (null == obj) { //如果发现没有数据
rwLock.readLock().unlock() ; //那么把写锁给释放掉
rwLock.writeLock().lock() ; //把写锁给锁起来 这样就可以写锁了
///-----这个个步骤是从数据库取数据的,别的人是无法来读取数据和写入数据的
try {
System.out.println("mysql数据库中取得数据开始。。。。。。");
Thread.sleep(1000*5) ;
obj = "chenwei" ;
map.put(key, obj) ;
System.out.println("mysql数据库中取得数据结束。。。。。。");
} catch (InterruptedException e) {
e.printStackTrace();
}finally {
//不管有没有写好,都要释放掉这个写锁,要不死掉以后,别的线程来取得时候,就发现无法取得到写锁就一直等到就没用了
rwLock.writeLock().unlock() ;
}
///
}//end if
return obj ;
}
}
标签:rwLock,缓存,java,Object,return,发包,key,obj From: https://blog.51cto.com/u_16034393/6153204