标签:
读写锁
package cn.sniper.thread.lock;
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 Cache {
private final static Map<String, Object> CACHE = new HashMap<String, Object>();
private final static ReadWriteLock RWL = new ReentrantReadWriteLock();
/**
* 多线程环境下存在线程安全问题
* @param key
* @return
*/
public static Object getValue(String key) {
Object value = CACHE.get(key);
if(value == null) {
value = "haha";
CACHE.put(key, value);
}
return value;
}
/**
* 多线程环境下,不存在线程安全问题,但是由于加了同步,导致效率低
* @param key
* @return
*/
public synchronized static Object getValue2(String key) {
Object value = CACHE.get(key);
if(value == null) {
value = "haha";
CACHE.put(key, value);
}
return value;
}
/**
* 采用读写锁的方式,效率比synchronized方式高很多
* @param key
* @return
*/
public static Object getValue3(String key) {
RWL.readLock().lock();
//避免线程执行过程中出现异常,锁不会被释放,所以,用try...finally...方式
Object value = CACHE.get(key);
if(value == null) {
RWL.readLock().unlock();
RWL.writeLock().lock();
if(value == null) {
value = "haha";
CACHE.put(key, value);
}
RWL.writeLock().unlock();
RWL.readLock().lock();
}
RWL.readLock().unlock();
return value;
}
/**
* 采用读写锁的方式,效率比synchronized方式高很多
* @param key
* @return
*/
public static Object getValue4(String key) {
RWL.readLock().lock();
Object value = null;
//避免线程执行过程中出现异常,锁不会被释放,所以,用try...finally...方式
try {
value = CACHE.get(key);
if(value == null) {
RWL.readLock().unlock();
try {
RWL.writeLock().lock();
try {
if(value == null) {
value = "haha";
CACHE.put(key, value);
}
} finally {
RWL.writeLock().unlock();
}
} finally {
RWL.readLock().lock();
}
}
} finally {
RWL.readLock().unlock();
}
return value;
}
}
标签:
原文地址:http://my.oschina.net/sniperLi/blog/489506