標籤:
讀寫鎖
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; }}
Java讀寫鎖,多線程環境下提升效率