开发中遇到并发的问题个别会用到锁,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时,后果如下:
一个线程必须期待另一个线程退出,能力进入,阐明了写写互斥!
起源:https://www.cnblogs.com/liuqi…
近期热文举荐:
1.1,000+ 道 Java面试题及答案整顿(2022最新版)
2.劲爆!Java 协程要来了。。。
3.Spring Boot 2.x 教程,太全了!
4.别再写满屏的爆爆爆炸类了,试试装璜器模式,这才是优雅的形式!!
5.《Java开发手册(嵩山版)》最新公布,速速下载!
感觉不错,别忘了顺手点赞+转发哦!
发表回复