阿里一面:ReadWriteLock 读写之间互斥吗?我竟然答不上来。。
Posted xhmj12
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了阿里一面:ReadWriteLock 读写之间互斥吗?我竟然答不上来。。相关的知识,希望对你有一定的参考价值。
上一篇:闲鱼面试官:Thread.sleep(0) 到底有什么用?我:有点懵~
来源:https://www.cnblogs.com/liuqing576598117/p/11168528.html
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时,结果如下:
一个线程必须等待另一个线程退出,才能进入,说明了读写互斥!
当我们启动线程t3和t4时,结果如下:
一个线程必须等待另一个线程退出,才能进入,说明了写写互斥!
以上是关于阿里一面:ReadWriteLock 读写之间互斥吗?我竟然答不上来。。的主要内容,如果未能解决你的问题,请参考以下文章