读写锁的相关知识学习
1.读写锁
1.1 读写锁的介绍
ReadWriteLock是JUC中的一个接口,他的实现类是ReentrantReadWriteLock;
读写锁是在锁的基础上更加明确化的去控制,明确标识是读锁,还是写锁。
读写锁允许多个线程同时读共享变量,但是只允许一个线程写共享变量,当写共享变量的时候也会阻塞读的操作,这样在读的时候就不会互斥,提高读的效率。
主要的原则是读的时候可以被多个线程同时读,写的时候只能有一个线程去写。
在JUC中ReadWriteLock读写锁,是怎么实现上面这种描述的呢?
1.2 读写锁的使用
使用JUC中的ReadWriteLock读写锁的时候,基本和使用Lock锁类似,通过加锁,try、catch、finally中加业务代码,解锁的方式达到线程同步的效果;
具体方法是:
1.2.1 通过对象.writeLock().lock()实现写入时加锁,即在写入的方法中,通过writeLock()方法标识写锁,然后通过lock()方法加锁,确保在写入完成之前没有其他线程加入这个写入操作;
通过对象.readLock().lock()实现读取时加锁,即在读取的方法中,通过readLock()方法标识读锁,然后通过lock()方法加锁,在读方法中加锁是为了方式读取的时候有线程进行写入操作;
1.2.2 再在try、catch、finally中加业务代码;
1.2.3 通过对象.writeLock().unlock()实现写入方法的解锁,即在写入的方法结束后,通过writeLock()方法标识写锁,然后通过unlock()方法解锁;
通过对象.readLock().unlock()实现写入方法的解锁,即在读取的方法结束后,通过readLock()方法标识读锁,然后通过unlock()方法解锁;
1.3 读写锁遵循的原则
1.3.1 写锁,也可以称为独占锁,在写入操作的时候,一次只能被一个线程所占用;
1.3.2 读锁,也可以称为共享锁,在读取操作的时候,可以同时被多个线程锁占有使用;
1.3.3 综上所述,读取的时候可以允许多个线程一起读取;写入的时候只能允许一个线程写入;写入的时候不允许有线程进行读取操作,并且读取的时候也不允许有线程进行写入操作。
ReadWriteLock lock = new ReentrantReadWriteLock();
//写锁
void write(){
lock.writeLock().lock();
try {
System.out.println("相关业务");
} catch (Exception e) {
e.printStackTrace();
} finally {
lock.writeLock().lock();
}
}
//读锁
void read(){
lock.readLock().lock();
try {
System.out.println("相关业务");
} catch (Exception e) {
e.printStackTrace();
} finally {
lock.readLock().lock();
}
}
- 点赞
- 收藏
- 关注作者
评论(0)