`

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

阅读更多
---------------------- android培训java培训、期待与您交流! ----------------------
在学习黑马基础知识视频的时候,看到了下边一段程序对读写锁的使用:
在学习过程对于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判断没有必要,在看开发文档中对于读写锁部分实例中判断条件局势全局变量,所以能够达到数据共享的效果,如果一个线程得到写锁,处理完数据另外的数据得到写锁可能处理同样的数据,所以需要进行判断;

---------------------- android培训java培训、期待与您交流! ----------------------

详细请查看:http://edu.csdn.net/heima
分享到:
评论

相关推荐

Global site tag (gtag.js) - Google Analytics