package com.atguigu.bigdata.juc;
import java.util.HashMap;
import java.util.Map;
import java.util.UUID;
import java.util.concurrent.TimeUnit;
import java.util.concurrent.locks.Lock;
import java.util.concurrent.locks.ReadWriteLock;
import java.util.concurrent.locks.ReentrantReadWriteLock;
/**
* @auth tianmin
* @date 2020-03-03 - 11:15
* @nodes 读写锁
* 1.多个线程同时读一个资源类没有任何问题,所以为了满足并发量,读取共享资源应该可以同时进行。
* 2.但是如果有一个资源想去写共享资源,就不应该有其他资源对它进行读或者写
*
* 总结:
* 读-读能共存
* 读-写不能共存
* 写-写不能共存
*
* 运行结果:
* 1 开始读数据
* 0 开始读数据
* 3 开始读数据
* 2 开始读数据
* 4 开始读数据
* 3 读数据完成null
* 0 读数据完成null
* 4 读数据完成null
* 2 读数据完成null
* 1 读数据完成null
* 4 -----开始写入数据
* 4 -----写完成
* 1 -----开始写入数据
* 1 -----写完成
* 0 -----开始写入数据
* 0 -----写完成
* 2 -----开始写入数据
* 2 -----写完成
* 3 -----开始写入数据
* 3 -----写完成
*/
public class ReadWirteLockDemo {
public static void main(String[] args) {
MyCache myCache = new MyCache();
// 开启5个线程写数据
for (int i = 0; i < 5; i++) {
final int tempi = i;
new Thread(()->{
myCache.put(tempi, UUID.randomUUID().toString());
},String.valueOf(i)).start();
}
// 开启5个线程读数据
for (int i = 0; i < 5; i++) {
final int tempi = i;
new Thread(()->{
myCache.get(tempi);
},String.valueOf(i)).start();
}
}
}
class MyCache{
private Map<Integer,String> map = new HashMap<>();
//读写锁对象
private ReadWriteLock readWriteLock = new ReentrantReadWriteLock();
// 写锁
private Lock writeLock = readWriteLock.writeLock();
// 读锁
private Lock readeLock = readWriteLock.readLock();
/**
* 插入数据
* @param key
* @param value
*/
public void put(Integer key,String value){
writeLock.lock();
try {
System.out.println(Thread.currentThread().getName() + "\t -----开始写入数据");
try {
TimeUnit.MILLISECONDS.sleep(100);
} catch (InterruptedException e) {
e.printStackTrace();
}
map.put(key, value);
System.out.println(Thread.currentThread().getName() + "\t -----写完成");
}finally {
writeLock.unlock();
}
}
/**
* 读数据
* @param key
*/
public void get(Integer key){
readeLock.lock();
try {
System.out.println(Thread.currentThread().getName() + "\t 开始读数据");
try {
TimeUnit.MILLISECONDS.sleep(100);
} catch (InterruptedException e) {
e.printStackTrace();
}
String value = map.get(key);
System.out.println(Thread.currentThread().getName() + "\t 读数据完成" + value);
}finally {
readeLock.unlock();
}
}
}
ReadWriteLock(读写锁)
最新推荐文章于 2022-04-19 13:53:01 发布