java 读写锁

这次实验一下读写锁。

 

一、是什么

为了更好的性能,区分读写的情况,所加的锁,就是读写锁。

二、为什么

为了提升锁的性能。上篇文章也有提到:

在对数据进行读写的时候,为了保证数据的一致性和完整性,读和写是互斥的,写和写是互斥的,但是读和读是不需要互斥的,所以加锁的时候应该考虑到以上几种不同情景,加以区分。

使用sychronized做不到这一点(同一时间只有一个同步方法可以执行,不能实现“读与读之间的非互斥”)。但是我们可以使用“读写锁”来做到这一点,所以性能更优秀。

三、怎么做

这是一个同步有问题的例子:

这个例子的问题在于:data类中的num作为共享资源,却没有任何方法实现同步,为其提供保障。结果为:

为了实现同步,我们更改一下get和set方法,加上synchronized实现同步:

改完之后,结果变为:

实现同步方法之后,结果正确了,但是因为get方法使用synchronized实现了同步,所以读和读方法之间也存在互斥,不能实现并发。

在这种情景中,可以使用读写锁:

写方法加上写锁,写锁之间互斥。如果写锁资源被占有,则调用写方法的线程进入阻塞状态,等待写锁资源被释放。

同理,读方法和写方法之间互斥。

读方法加上读锁,读锁之间不是互斥的(不同线程同时读相同的资源时,不会出现同步问题)。但是读锁和写锁互斥。

运行结果:

从结果可见,读锁之间没有互斥。写锁与写锁、读锁和写锁之间依然存在互斥,保障了并发条件下数据的安全。

因为读与读锁之间不存在互斥,所以读写锁的性能比synchronized/单纯的lock和unlock效果要好。

四、总结

读写锁是性能更加优异的锁,在存在“读写”的场景中应该尽量使用。

发表评论

电子邮件地址不会被公开。 必填项已用*标注