面试官:ReadWriteLock读写之间互斥吗?






以下正文:

开发中遇到并发的问题一般会用到锁,Synchronized存在明显的一个性能问题就是读与读之间互斥;

ReadWriteLock是JDK5中提供的读写分离锁。读写分离锁可以有效地帮助减少锁竞争,以提升系统的性能。

ReadWriteLock管理一组锁,一个是只读的锁,一个是写锁。

Java并发库中ReetrantReadWriteLock实现了ReadWriteLock接口并添加了可重入的特性。

读写锁ReentrantReadWriteLock:读读共享,读写互斥,写写互斥; 读写锁维护了一对锁,一个读锁,一个写锁,通过分离读锁和写锁,使得并发性相比一般的排他锁有了很大提升。在读多写少的情况下,读写锁能够提供比排他锁更好的并发性和吞吐量。

从源码中可以看出,读写锁中同样依赖队列同步器Sync(AQS)实现同步功能,而读写状态就是其同步器的同步状态。推荐:Java进阶视频资源

下面从例子中来说明:读读共享,读写互斥,写写互斥

代码如下:

public class ReentrantWriteReadLockTest {
    ReentrantReadWriteLock lock = new ReentrantReadWriteLock();
    ReadLock readLock = lock.readLock();
    WriteLock writeLock = lock.writeLock();
    
    public void read(){
        try {
            readLock.lock();
            System.out.println("线程"+Thread.currentThread().getName()+"进入。。。");
            Thread.sleep(3000);
            System.out.println("线程"+Thread.currentThread().getName()+"退出。。。");
        } catch (InterruptedException e) {
            e.printStackTrace();
        }finally{
            readLock.unlock();
        }
    }
    
    public void write(){
        try {
            writeLock.lock();
            System.out.println("线程"+Thread.currentThread().getName()+"进入。。。");
            Thread.sleep(3000);
            System.out.println("线程"+Thread.currentThread().getName()+"退出。。。");
        } catch (InterruptedException e) {
            e.printStackTrace();
        }finally{
            writeLock.unlock();
        }
    }
    
 
    public static void main(String[] args) {
        final ReentrantWriteReadLockTest wr = new ReentrantWriteReadLockTest();
        Thread t1 = new Thread(new Runnable() {
            public void run() {
                wr.read();
            }
        }, "t1");
        Thread t2 = new Thread(new Runnable() {
            public void run() {
                wr.read();
            }
        }, "t2");
        Thread t3 = new Thread(new Runnable() {
            public void run() {
                wr.write();
            }
        }, "t3");
        Thread t4 = new Thread(new Runnable() {
            public void run() {
                wr.write();
            }
        }, "t4");
        
        t1.start();
        t2.start();
        //t3.start();
        //t4.start();
    }
}

当我们启动线程t1和t2时,结果如下:

线程t1和t2可以同时进入,说明了读读共享

当我们启动线程t2和t3时,结果如下:

一个线程必须等待另一个线程退出,才能进入,说明了读写互斥

当我们启动线程t3和t4时,结果如下:

一个线程必须等待另一个线程退出,才能进入,说明了写写互斥







END

1.并发环境下如何利用加锁机制保证数据一致性2.说说悲观锁、乐观锁、分布式锁?都在什么场景下使用?有什么技巧?3.什么是自旋锁?自旋的好处和后果是什么呢?4.Java中的锁原理、锁优化、CAS、AQS,面试看这篇就对了

我是技术程管家,专心做内容,不割韭菜

分享技术成长之路,不忘初心,惠泽他人终身学习,与时俱进,点赞关注不迷路

相关推荐

  • 无需网络,也能部署Harbor?离线安装攻略来了!
  • 被开除了,因为用了Docker。。
  • 程序汪7万接的无人台球室项目,开发周期37天
  • 一代快时尚鼻祖走到了悬崖边
  • 马斯克称一些被裁员工的遣散费过低,将予以补偿;Mistral 宣布最新开放大模型 Mixtral 8x22B | 极客头条
  • 用 AI 和不用 AI 学习编码,区别在于……
  • 调查了 150 位 ChatGPT 用户后,有了最新的发现
  • 退休一天后,波士顿动力宣布:人形机器人 Atlas 以全新电动化状态“复活”!
  • 创业14年,我总结了7条最重要的赚钱原则
  • ChatGPT、大模型、AI资料分享群
  • 5个简单好用的本地运行大模型的方法
  • 这款Linux发版发起AI禁令!生成代码质量堪忧!阿里也被大模型幻觉愚弄了!网友:人比生产力更重要!
  • 如何用 AI 工具做数据分析与可视化?
  • 这个 404 页面,是真的炫酷~
  • 耗时几个月,我们做的小工具上线啦!
  • Kafka的2种日志清理策略感受一下
  • 波士顿动力抛弃液压机器人Atlas,推出全新电动化机器人,动作超灵活
  • Stable Diffusion 3 API 发布!超越Midjourney v6和DALL-E 3
  • 极越员工称因购买小米SU7被辞退?公司回应来了
  • 利用 GitOps 优化阿迪达斯的容器平台