标签:
读写锁
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