文档章节

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

Zero零_度
 Zero零_度
发布于 2015/08/08 15:21
字数 309
阅读 136
收藏 3

读写锁

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;
 }
}

© 著作权归作者所有

Zero零_度
粉丝 69
博文 1267
码字总数 263854
作品 0
程序员
私信 提问
(深度)Java多线程系列(6):volatile 关键字的使用

原文地址:https://segmentfault.com/a/1190000008637202 作为 Java 语言的一个关键字,被看作是轻量级的 (锁)。虽然 只具有的部分功能,但是一般使用 会比使用 更有效率。在编写多线程程序...

芝麻粒儿
03/24
0
0
面试系列-40个Java多线程问题总结

前言 这篇文章主要是对多线程的问题进行总结的,因此罗列了40个多线程的问题。 这些多线程的问题,有些来源于各大网站、有些来源于自己的思考。可能有些问题网上有、可能有些问题对应的答案也...

Ryan-瑞恩
2018/07/23
163
2
史上最详细Java多线程面试题及答案!

synchronized实现原理 当一个线程试图访问同步代码块时,他首先必须得到锁,退出或抛出异常时必须释放锁。那么锁到底存在哪里呢?锁里面会存储什么信息呢? 从JVM规范中可以看到Synchronize...

ggod
06/11
61
0
4种常用Java线程锁的特点,性能比较及使用场景

多个线程同时对同一个对象进行读写操作,很容易会出现一些难以预料的问题。所以很多时候我们需要给代码块加锁,同一时刻只允许一个线程对某个对象进行操作。多线程之所以会容易引发一些难以发现...

mikechen优知
03/10
125
0
java中使用多线程不能明显提高程序效率的一些原因.

java中使用多线程不能明显提高程序效率的一些原因. 使用多个线程来处理多任务的时候,效率肯定是有提高的.但是必须要慎用,否则容易出现问题. 1.多线程主要是为了充分利用多核cpu,大内存这些资...

Zhao-Qian
2012/08/15
3.4K
2

没有更多内容

加载失败,请刷新页面

加载更多

医疗在线客服咨询系统有哪些特点?

随着中国互联网网站的的快速发展,至今医疗行业已经拥有了独立的的运营网站,其中最具特色的便属于医疗在线客服咨询系统,医疗在线客服咨询系统为每个访问网站的患者提供即时的网络在线客服服...

唯喏
今天
10
0
skywalking(容器部署)

skywalking(容器部署) 标签(空格分隔): APM [toc] 1. Elasticsearch SkywalkingElasticsearch 5.X(部分功能报错、拓扑图不显示) Skywalking需要Elasticsearch 6.X docker network create......

JUKE
今天
8
0
解决Unable to find a single main class from the following candidates [xxx,xxx]

一、问题描述 1.1 开发环境配置 pom.xml <plugin><groupId>org.springframework.boot</groupId><artifactId>spring-boot-maven-plugin</artifactId><!--一定要对上springboot版本号,因......

TeddyIH
今天
7
0
玩转Spring Boot 注册Servlet、Filter、Listener

玩转Spring Boot 注册Servlet、Filter、Listener JAVA架构师Ya七月 2019-08-23 玩转Spring Boot 注册Servlet、Filter、Listener 在Servlet 3.0之前我们都是使用web.xml进行配置,需要增加Ser...

Java架构师ya七
今天
5
0
Dubbo服务限制大数据传输抛Data length too large: 13055248, max payload: 8388608解决方案

当dubbo服务提供者向消费层传输大数据容量数据时,会受到Dubbo的限制,报类似如下异常: 2019-08-23 11:04:31.711 [ DubboServerHandler-XX.XX.XX.XXX:20880-thread-87] - [ ERROR ] [com.al...

huangkejie
今天
9
0

没有更多内容

加载失败,请刷新页面

加载更多

返回顶部
顶部