import java.util.HashMap;
import java.util.Map;
import java.util.concurrent.locks.Lock;
import java.util.concurrent.locks.ReentrantLock;
import java.util.concurrent.locks.ReentrantReadWriteLock;
// 读写锁
public class T8 {
public static void main(String[] args) {
MyCache myCache = new MyCache();
for (int i = 1; i <= 5; i++) {
final int temp = i;
new Thread(new Runnable() {
@Override
public void run() {
myCache.put(temp+"",temp+"");
}
},String.valueOf(temp)).start();
}
for (int i = 1; i <= 5; i++) {
final int temp = i;
new Thread(new Runnable() {
@Override
public void run() {
myCache.read(temp+"");
}
},String.valueOf(temp)).start();
}
}
}
class MyCache{
private volatile Map<String,Object> map = new HashMap<>();
private ReentrantReadWriteLock lock = new ReentrantReadWriteLock(); // 可重入的读写锁
public void put(String key,Object value){
lock.writeLock().lock();
try {
System.out.println(Thread.currentThread().getName()+" 正在写入..."+key);
try {
Thread.sleep(3000);
} catch (Exception e){
e.printStackTrace();
}
map.put(key,value);
System.out.println(Thread.currentThread().getName()+" 写入完成...");
} catch (Exception e){
e.printStackTrace();
} finally {
lock.writeLock().unlock();
}
}
public Object read(String key){
lock.readLock().lock();
try {
System.out.println(Thread.currentThread().getName()+" 正在读取...");
try {
Thread.sleep(1000);
} catch (Exception e){
e.printStackTrace();
}
Object result = map.get(key);
System.out.println(Thread.currentThread().getName()+" 读取完成..."+result);
return result;
} catch (Exception e){
e.printStackTrace();
} finally {
lock.readLock().unlock();
return null;
}
}
}
结果:
D:\Application\Java\jdk1.8.0_201\bin\java.exe "-javaagent:D:\Application\IntelliJ IDEA 2018.3.4\lib\idea_rt.jar=63784:D:\Application\IntelliJ IDEA 2018.3.4\bin" -Dfile.encoding=UTF-8 -classpath D:\Application\Java\jdk1.8.0_201\jre\lib\charsets.jar;D:\Application\Java\jdk1.8.0_201\jre\lib\deploy.jar;D:\Application\Java\jdk1.8.0_201\jre\lib\ext\access-bridge-64.jar;D:\Application\Java\jdk1.8.0_201\jre\lib\ext\cldrdata.jar;D:\Application\Java\jdk1.8.0_201\jre\lib\ext\dnsns.jar;D:\Application\Java\jdk1.8.0_201\jre\lib\ext\jaccess.jar;D:\Application\Java\jdk1.8.0_201\jre\lib\ext\jfxrt.jar;D:\Application\Java\jdk1.8.0_201\jre\lib\ext\localedata.jar;D:\Application\Java\jdk1.8.0_201\jre\lib\ext\nashorn.jar;D:\Application\Java\jdk1.8.0_201\jre\lib\ext\sunec.jar;D:\Application\Java\jdk1.8.0_201\jre\lib\ext\sunjce_provider.jar;D:\Application\Java\jdk1.8.0_201\jre\lib\ext\sunmscapi.jar;D:\Application\Java\jdk1.8.0_201\jre\lib\ext\sunpkcs11.jar;D:\Application\Java\jdk1.8.0_201\jre\lib\ext\zipfs.jar;D:\Application\Java\jdk1.8.0_201\jre\lib\javaws.jar;D:\Application\Java\jdk1.8.0_201\jre\lib\jce.jar;D:\Application\Java\jdk1.8.0_201\jre\lib\jfr.jar;D:\Application\Java\jdk1.8.0_201\jre\lib\jfxswt.jar;D:\Application\Java\jdk1.8.0_201\jre\lib\jsse.jar;D:\Application\Java\jdk1.8.0_201\jre\lib\management-agent.jar;D:\Application\Java\jdk1.8.0_201\jre\lib\plugin.jar;D:\Application\Java\jdk1.8.0_201\jre\lib\resources.jar;D:\Application\Java\jdk1.8.0_201\jre\lib\rt.jar;D:\Workspace\flutter\letsJava\target\classes T8
1 正在写入...1
1 写入完成...
2 正在写入...2
2 写入完成...
3 正在写入...3
3 写入完成...
4 正在写入...4
4 写入完成...
5 正在写入...5
5 写入完成...
2 正在读取...
1 正在读取...
3 正在读取...
4 正在读取...
5 正在读取...
2 读取完成...2
1 读取完成...1
4 读取完成...4
5 读取完成...5
3 读取完成...3
Process finished with exit code 0