JUC-ReadWriteLock(读写锁)
一:概念
ReadWriteLock也是一个接口,提供了readLock和writeLock两种锁的操作机制。可以对一个资源同时读操作;不能对同一个资源读和写两种操作,也不能对同一个资源写/写操作。
读锁:共享锁readLock,可以被多个线程同时读,但是读的时候不能写。
写锁:独占锁writeLock。
总结:读写互斥,写写互斥,读读共享。
二:代码
package com.test.thread;
import java.util.HashMap;
import java.util.Map;
import java.util.concurrent.locks.ReadWriteLock;
import java.util.concurrent.locks.ReentrantReadWriteLock;
/**
* 读写锁
*/
public class ReadWriteLockTest {
public static void main(String[] args) {
MyCacheLock myCache = new MyCacheLock();
//十个写线程
for (int i = 0; i < 10; i++) {
final int temp=i;
new Thread(() -> {
myCache.put(temp+"",temp+"");
}, String.valueOf(i)).start();
}
//十个读线程
for (int i = 0; i < 10; i++) {
final int temp=i;
new Thread(() -> {
myCache.get(temp+"");
}, String.valueOf(i)).start();
}
}
}
//自定义集合缓存数据
class MyCacheLock{
private volatile Map<String, Object> map = new HashMap<>();
//读写锁 :更加细粒度的控制
private ReadWriteLock lock = new ReentrantReadWriteLock();
//存入值 写的时候只希望同时只有一个线程写
public void put(String key, Object value) {
//加写锁
lock.writeLock().lock();
try {
System.out.println(Thread.currentThread().getName() + "写入" + key);
map.put(key, value);
System.out.println(Thread.currentThread().getName() + "写入完成");
} catch (Exception e) {
} finally {
lock.writeLock().unlock();
}
}
//取值 读所有人都可以读
public void get(String key) {
//加读锁
lock.readLock().lock();
try {
System.out.println(Thread.currentThread().getName() + "读取" + key);
Object o = map.get(key);
System.out.println(Thread.currentThread().getName() + "读取完成");
} catch (Exception e) {
} finally {
lock.readLock().unlock();
}
}
}