package com.chaohu.cache;
import java.util.HashMap;
import java.util.Map;
import java.util.concurrent.locks.ReentrantReadWriteLock;
//缓存资源类
public class MyCache {
public static void main(String[] args) {
MyCache myCache = new MyCache();
/*
* 五个线程正在写
*/
for (int i = 1; i <= 5; i++){
final int threadNum = i;
new Thread(new Runnable() {
@Override
public void run() {
myCache.put(String.valueOf(threadNum),String.valueOf(threadNum));
}
},String.valueOf(threadNum)).start();
}
/*
* 五个线程正在读
*/
for (int i = 1; i <= 5; i++){
final int threadNum = i;
new Thread(new Runnable() {
@Override
public void run() {
myCache.get(String.valueOf(threadNum));
}
},String.valueOf(threadNum)).start();
}
}
//放入缓存的数据要用volatile修饰(保证可见性)
//tips:
// volatile:保证可见性,不保证原子性,禁止指令重排
private volatile Map<String,Object> map = new HashMap<>();
private ReentrantReadWriteLock rwLock = new ReentrantReadWriteLock();
/**
* 写入缓存中(不可以共享)
* 写操作:原子+独占,整个过程必须是一个完整的统一体,
* 中间不许被分割,不许被打断。
* @param key
* @param value
*/
public void put(String key,Object value){
rwLock.writeLock().lock();
try {
System.out.println(Thread.currentThread().getName() + " 正在写入: " + key);
try {
//模拟网络延迟
Thread.sleep(300);
} catch (InterruptedException e) {
e.printStackTrace();
}
map.put(key,value);
System.out.println(Thread.currentThread().getName() + " 写入完成");
} catch (Exception e) {
e.printStackTrace();
} finally {
rwLock.writeLock().unlock();
}
}
/**
* 读取缓存数据(可以共享)
* @param key
*/
public void get(String key){
rwLock.readLock().lock();
try {
System.out.println(Thread.currentThread().getName() + " 正在读取:");
try {
//模拟网络延迟
Thread.sleep(300);
} catch (InterruptedException e) {
e.printStackTrace();
}
Object result = map.get(key);
System.out.println(Thread.currentThread().getName() + "完成读取:" + result);
} catch (Exception e) {
e.printStackTrace();
} finally {
rwLock.readLock().unlock();
}
}
}
07-09
2719