Java之读写锁
ReentrantReadWriteLock类的使用,这个ReentrantReadWriteLock类是ReadWriteLock的实现类
代码实现
import java.util.HashMap;
import java.util.Map;
import java.util.concurrent.locks.ReentrantReadWriteLock;
/**
* 独占锁(写锁)一次只能被一个线程占有
* 共享锁(读锁)多个线程可以同时占有
* ReentrantReadWriteLock
* 读-读:可以共存
* 读-写:不可以共存
* 写-写:不可以共存
*/
public class ReadWriteLock {
public static void main(String[] args) {
MyCache2 myCache = new MyCache2();
//写锁
for (int i = 1; i <= 5; i++) {
final int temp = i;
new Thread(()->{myCache.put(temp+"",temp);},String.valueOf(i)).start();
}
//读锁
for (int i = 1; i <= 5; i++) {
final int temp = i;
new Thread(()->{myCache.get(temp+"");},String.valueOf(i)).start();
}
}
}
/**
* 自定义缓存
*/
class MyCache{
private volatile Map<String,Object> map = new HashMap<>();
public void put(String key,Object value){
System.out.println(Thread.currentThread().getName()+"写入"+key);
map.put(key, value);
System.out.println(Thread.currentThread().getName()+"写入OK");
}
public void get(String key){
System.out.println(Thread.currentThread().getName()+"读取"+key);
map.get(key);
System.out.println(Thread.currentThread().getName()+"读取OK");
}
}
//加锁的
class MyCache2{
private volatile Map<String,Object> map = new HashMap<>();
//读写锁:更加细粒度的控制
private ReentrantReadWriteLock readWriteLock = new ReentrantReadWriteLock();
//存,写入的时候,只希望同时只有一个线程写
public void put(String key,Object value){
readWriteLock.writeLock().lock();//加锁
try {//业务代码
System.out.println(Thread.currentThread().getName()+"写入"+key);
map.put(key, value);
System.out.println(Thread.currentThread().getName()+"写入OK");
} catch (Exception e) {
e.printStackTrace();
}finally {
readWriteLock.writeLock().unlock();//解锁
}
}
//取,读,所有人都可以读!
public void get(String key){
readWriteLock.readLock().lock();
try {
System.out.println(Thread.currentThread().getName()+"读取"+key);
map.get(key);
System.out.println(Thread.currentThread().getName()+"读取OK");
} catch (Exception e) {
e.printStackTrace();
}finally {
readWriteLock.readLock().unlock();
}
}
}