(转载)StampedLock、ReadWriteLock以及synchronized的比较

对于方法和代码块,语言层面的加锁机制是synchronized关键字,该关键字是由HotSpot虚拟机内置的。我们在代码中分配的每一个对象,如StringArray或者一个完整的JSON文档,在本地垃圾回收级别都具有内置的加锁能力

读写锁(ReadWriteLock)指定哪些线程可以阻塞其他线程(写线程),哪些线程可以与其他线程共享数据(读线程),读写锁还是不够快,并且有时候慢得要死,慢到你觉得就不应该使用它, 可重入的

StampedLock使用了一组新的算法以及Java 8 JDK中引入的内存屏障的特性,这使得这个锁更高效也更健壮, 它们使用了一个票据(stamp)的概念,这是一个long值,在加锁和解锁操作时,它被用作一张门票。这意味着要解锁一个操作你需要传递相应的的门票。如果传递错误的门票,那么可能会抛出一个异常,或者其他意想不到的错误, 不可重入. 乐观锁,继续执行读,并且结束后同时判断该值是否被修改,如果被修改,你再进行重试,或者升级成一个更重的锁

总体看来, 整体性能表现最好的仍然是内置的同步锁。但是,这里并不是说内置的同步锁会在所有的情况下都执行得最好。这里主要想表达的是在你将你的代码投入生产之前,应该基于预期的竞争级别和读写线程之间的分配进行测试,再选择适当一个适当的锁。否则你会面临线上故障的风险。


原文地址:http://ifeve.com/java-8-stampedlocks-vs-readwritelocks-and-synchronized/

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值