时间:2021-05-20
本文研究的主要是ReadWriteLock特性,具体如下。
readLock 与 readLock 不互斥
readLock 与 writeLock 互斥
writeLock 与 readLock 互斥
writeLock 与 writeLock 互斥
线程1, 先拿到readLock, 线程2试图拿readLock, 可以拿到
线程1, 先拿到readLock, 线程2试图拿writeLock, 阻塞等待,直到线程1释放锁之后才可以拿到
线程1, 先拿到writeLock,线程2试图拿readLock, 阻塞等待,直到线程1释放锁之后才可以拿到
线程1, 先拿到writeLock,线程2试图拿writeLock, 阻塞等待,直到线程1释放锁之后才可以拿到
Thread[Thread-2,5,main] read :begin 2018-01-22 13:54:16.794
Thread[Thread-1,5,main] read :begin 2018-01-22 13:54:16.794
Thread[Thread-2,5,main] read :end 2018-01-22 13:54:21.795
Thread[Thread-1,5,main] read :end 2018-01-22 13:54:21.795
Thread[Thread-0,5,main] write:begin 2018-01-22 13:54:21.795
Thread[Thread-0,5,main] write:end 2018-01-22 13:54:26.795
同时启动了3个线程,其中1号线程Thread[Thread-0,5,main],执行write时先休眠了2秒.那么 2,3号线程Thread[Thread-1,5,main],Thread[Thread-2,5,main]将会优先执行代码
read.lock();由于read.lock();是不互斥的(即可重入的),所以他们同时拿到了锁,通过日志可以看出来
Thread[Thread-2,5,main] read :begin 2018-01-22 13:54:16.794Thread[Thread-1,5,main] read :begin 2018-01-22 13:54:16.794而且他们执行的时间开销是相同的(测试代码中都是休眠5秒),所以也将同时执行结束
Thread[Thread-2,5,main] read :end 2018-01-22 13:54:21.795Thread[Thread-1,5,main] read :end 2018-01-22 13:54:21.795只有当所有的readLock被释放掉之后,writeLock才能拿到锁,而这个时候Thread[Thread-1,5,main],Thread[Thread-2,5,main]执行结束后就会释放锁readLock
所以Thread[Thread-0,5,main]这个时候拿到了writeLock并执行自己的业务代码
Thread[Thread-0,5,main] write:begin 2018-01-22 13:54:21.795Thread[Thread-0,5,main] write:end 2018-01-22 13:54:26.795以上就是本文关于Java语言ReadWriteLock特性实例测试的全部内容,希望对大家有所帮助。感兴趣的朋友可以继续参阅本站其他相关专题,如有不足之处,欢迎留言指出。感谢朋友们对本站的支持!
声明:本页内容来源网络,仅供用户参考;我单位不保证亦不表示资料全面及准确无误,也不保证亦不表示这些资料为最新信息,如因任何原因,本网内容或者用户因倚赖本网内容造成任何损失或损害,我单位将不会负任何法律责任。如涉及版权问题,请提交至online#300.cn邮箱联系删除。
本文实例讲述了java单元测试JUnit框架原理与用法。分享给大家供大家参考,具体如下:1简介JUnit是一个Java语言的单元测试框架,它由KentBeck和
Java语言的作者们编写了具有广泛影响的Java白皮书,里面详细地介绍了他们的设计目标以及实现成果,还用简短的篇幅介绍了Java语言的特性。下面将对这些特性进行
JavaScript的核心之一ECMAScript的语言特性和Java、C、Perl都有许多相似之处,其中不少特性都是从这些语言借鉴而来,同时它们之间也存在许多
从java的动态性到类加载机制Java是一种动态语言。那么怎样理解这个“动态”呢?或者说一门语言具备了什么特性,才能称之为动态语言呢?对于java,我是这样理解
java中stack类继承于vector,其特性为后进先出(lastinfirstout).入栈和出栈实例图:实例图的java代码实例:packagecom.l