码迷,mamicode.com
首页 > 编程语言 > 详细

Java读写锁,多线程环境下提升效率

时间:2015-08-08 16:44:12      阅读:283      评论:0      收藏:0      [点我收藏+]

标签:

读写锁

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读写锁,多线程环境下提升效率

标签:

原文地址:http://my.oschina.net/sniperLi/blog/489506

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!