黑马程序员_java多线程多谢锁的使用

---------------------- [url=http://edu.csdn.net/heima]android培训[/url]、[url=http://edu.csdn.net/heima]java培训[/url]、期待与您交流! ----------------------
在学习黑马基础知识视频的时候,看到了下边一段程序对读写锁的使用:
在学习过程对于getData中的value判断很是纠结,value是一个局部变量 ,一个线程操作不影响另外的线程内容,为什么要判断第二次value==null呢,之后比较下边代码和jdk开发文档中的实例发现,如果数据共享需要第二次判断,否则不需要
下边是视频中的实例代码
package cn.itcast.heima2;

import java.util.HashMap;
import java.util.Map;
import java.util.concurrent.locks.ReadWriteLock;
import java.util.concurrent.locks.ReentrantReadWriteLock;

public class CacheDemo {

private Map<String, Object> cache = new HashMap<String, Object>();
public static void main(String[] args) {
// TODO Auto-generated method stub

}

private ReadWriteLock rwl = new ReentrantReadWriteLock();
public Object getData(String key){
rwl.readLock().lock();
Object value = null;//局部变量
try{
value = cache.get(key);
if(value == null){//第一次判断
rwl.readLock().unlock();
rwl.writeLock().lock();
try{//不同线程执行到次需要重新读取map中的数据进行判断,而不是使用原来的vlaue直接进行判断
if(value==null){//二次判断
value = "aaaa";//实际失去queryDB();
}
}finally{
rwl.writeLock().unlock();
}
rwl.readLock().lock();
}
}finally{
rwl.readLock().unlock();
}
return value;
}
}



在getData方法中存在两处对value变量的判断,咋一看之下和jdk开发文档上很相近考虑很周密,但是当看到value是getData方法的局部变量的时候,感觉实例存在小小的问题,value没有起到数据共享的作用,因此第二处的value==null判断没有必要,在看开发文档中对于读写锁部分实例中判断条件局势全局变量,所以能够达到数据共享的效果,如果一个线程得到写锁,处理完数据另外的数据得到写锁可能处理同样的数据,所以需要进行判断;

---------------------- [url=http://edu.csdn.net/heima]android培训[/url]、[url=http://edu.csdn.net/heima]java培训[/url]、期待与您交流! ----------------------

详细请查看:[url]http://edu.csdn.net/heima[/url]
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值