您的位置:首页 > 编程语言 > Java开发

JAVA多线程使用JDK1.5提供的读写锁实现高并发本地缓存工具类

2019-09-14 07:06 2799 查看
package com.study;

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

public class ReadWriteLockDemo {

private static Map<String, Object> cacheMap = new LinkedHashMap<String, Object>();

public static void main(String[] args) {
ReadWriteLockDemo readWriteLockDemo = new ReadWriteLockDemo();
final CacheUtils cacheUtils = readWriteLockDemo.new CacheUtils();
Thread thread = new Thread(new Runnable() {
@Override
public void run() {
for(Integer index = 0;index <= 100;index ++){
System.out.println(cacheUtils.putCache(index.toString()));
}
}
});
thread.start();

Thread thread2 = new Thread(new Runnable() {
@Override
public void run() {
for(Integer index = 0;index <= 100;index ++){
System.out.println(cacheUtils.putCache(index.toString()));
}
}
});
thread2.start();
}

class CacheUtils {
// 定义一把读写锁
ReadWriteLock readWriteLock = new ReentrantReadWriteLock();

public Object putCache(String key){
//进来时,先用读锁进行上锁
readWriteLock.readLock().lock();
Object value = null;
try {
value = cacheMap.get(key);
if(value == null){
readWriteLock.readLock().unlock();
try {
readWriteLock.writeLock().lock();
if(value == null){
//此处实际上是查询DB
value = "huangkejie" + key;
cacheMap.put(key, value);
}
} catch (Exception e) {
e.printStackTrace();
}finally{
readWriteLock.writeLock().unlock();
}
readWriteLock.readLock().lock();
}
} catch (Exception error) {
error.printStackTrace();
} finally{
readWriteLock.readLock().unlock();
}
return value;
}
}
}

 

内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签:  Java JDK