五分钟彻底理解ReentrantReadWriteLock

来源:互联网 发布:js数组取前几个 编辑:程序博客网 时间:2024/05/16 08:35

最近在看ReentrantReadWriteLock这个类,翻了很多博文,发现大多数都是原理性的,但如何理解这个类的作用上面,几乎没有一篇文章说的清楚的。本文将用几句话大概,来重点讲解下如何从实用层面彻底理解ReentrantReadWriteLock。


如何理解?

ReentrantReadWriteLock按照字面意思是读写锁,如果你把它理解为对IO的控制,那就大错特错了(其实大多数人的直觉是这样)。其实你只要把它理解成一个数据库的事务锁就对了。众所周知数据库事务锁的特点就是,读写分离。而ReentrantReadWriteLock是类似最高级的事务级别Serializable可串行化(严格讲比这个还更严谨)。什么意思呢,意思就是,对一条数据的更新操作只影响其它对该条数据的更新操作,而读操作是不影响的。   而并发锁Lock也好,synchronizy也好,是直接把读写都锁住的。就是说,该代码块一但锁住之后,既不能读也不能写。 但这样是有问题的,有些线程只是想读取一下数据,我又不改数据,你锁它干嘛呢?(类似事物吧) 所以ReentrantReadWriteLock把锁拆分成了读锁和写锁。  写锁之间的互斥的,但读锁不互斥(大家一起读数据么,压根就没冲突)。 但是有一点要注意。就是你想获取写锁,是除当前线程外,不能存在其它的读锁的。  好比就是说,我要改里面的数据了,那些获取了读锁的线程,必须通通退出来,否则会出现读到老数据的问题(类似事物里面的脏读) ,获取到写锁之后,其它线程也不能再获取到读锁了。

有何作用?

既然给并发锁分成了读写两个阶段,那Lock之后,在某些场景下,也能还能访问到Lock里面的代码块的。 等于开了个特定条件可以访问。 这样有什么好处呢? 好处就是,特定条件下,提高了性能: 本来都不能访问的数据,现在可以访问了,不用傻傻的全部排队等待互斥锁(当然这前提是要理解好和用好这个锁的含义)


特性?

特性有很多博文都写了很多也很好的例子,我这里就不重复造轮子了(大家自行度娘),这里只是简单几句话阐述该类的作用,方便大家理解而已。


希望对大家有帮助微笑

原创粉丝点击