阿里一面:ReadWriteLock 读写之间互斥吗?我竟然答不上来。。

Posted xhmj12

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了阿里一面:ReadWriteLock 读写之间互斥吗?我竟然答不上来。。相关的知识,希望对你有一定的参考价值。

上一篇:闲鱼面试官:Thread.sleep(0) 到底有什么用?我:有点懵~

来源:https://www.cnblogs.com/liuqing576598117/p/11168528.html

开发中遇到并发的问题一般会用到锁,Synchronized存在明显的一个性能问题就是读与读之间互斥;ReadWriteLock是JDK5中提供的读写分离锁。读写分离锁可以有效地帮助减少锁竞争,以提升系统的性能。

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

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

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

从源码中可以看出,读写锁中同样依赖队列同步器Sync(AQS)实现同步功能,而读写状态就是其同步器的同步状态。另外,搜索公众号互联网架构师后台回复“面试”,获取一份惊喜礼包。下面从例子中来说明:读读共享,读写互斥,写写互斥。

代码如下:

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时,结果如下:

 

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

1、2T架构师学习资料干货分享

2、985副教授工资曝光

3、字节跳动面试经验总结,已顺利拿到offer

4、雷军做程序员时写的博客,很强大!

5、人脸识别的时候,一定要穿上衣服啊!

6、清华大学:2021 元宇宙研究报告!

7、绩效被打3.25B,员工将支付宝告上了法院,判了

以上是关于阿里一面:ReadWriteLock 读写之间互斥吗?我竟然答不上来。。的主要内容,如果未能解决你的问题,请参考以下文章

阿里一面:ReadWriteLock 读写之间互斥吗?我竟然答不上来。。

阿里技术面:ReadWriteLock读写之间互斥吗?

ReadWriteLock 读写锁(读书笔记)

并发编程之ReadWriteLock读写锁

读写锁(ReadWriteLock)

java多线程 -- ReadWriteLock 读写锁