ReadWriteLock
基本介绍
- 独占锁(写锁) 一次只能被一个线程占有
- 共享锁(读锁) 多个线程可以同时占有
ReadWriteLock
- 读-读 可以共存!
- 读-写 不能共存!
- 写-写 不能共存!
- 可以多个线程同时读,但只能同时有一个线程去写!
简单代码实现:
举例说明:这里我们就用一个简单的读写缓存的例子来说明,分用读写锁和不用读写锁两种情况来对比
1.主方法
public class ReadWriteLockTest {
public static void main(String[] args) {
//无读写锁
MyCache myCache = new MyCache();
//有读写锁
// MyCacheLock myCache= new MyCacheLock();
//5个写的线程
for (int i = 1; i <= 5 ; i++) {
int finalI = i;
new Thread(() -> {
myCache.put(finalI +"",finalI+"");
},String.valueOf(i)).start();
}
for (int i = 1; i <= 5 ; i++) {
int finalI = i;
new Thread(() -> {
myCache.get(finalI +"");
},String.valueOf(i)).start();
}
}
}
2.无读写锁
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()+"写入成功");
}
public void get(String key){
System.out.println(Thread.currentThread().getName()+"正在读取"+key);
Object o = map.get(key);
System.out.println(Thread.currentThread().getName()+"读取成功");
}
}
运行结果:
这里可以看到1在写入的时候,5插队了,后面已经全都乱了
3.有读写锁
class MyCacheLock{
private volatile Map<String,Object> map = new HashMap<>();
ReadWriteLock 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()+"写入成功");
} 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);
Object o = map.get(key);
System.out.println(Thread.currentThread().getName()+"读取成功");
} catch (Exception e) {
e.printStackTrace();
} finally {
readWriteLock.readLock().unlock();
}
}
}
运行结果:
可以看到哈,写入的时候只能一个写完了,另一个才能开始写,而读就不存在,可以多个线程同时读!
读写锁不是很难,但是要会要知道要会用!
这次的讨论就到这里,欢迎大家留言讨论!