StampedLock

Strange behavior of StampedLock with Thread class

泄露秘密 提交于 2021-01-28 18:16:13
问题 I'm running this code in IntellijIDEA Community on Windows import static java.lang.Thread.sleep; public class Main { public static void main(String[] args) { StampedLock lock = new StampedLock(); Thread th = new Thread(() -> { long stamp = lock.tryOptimisticRead(); try { System.out.println("Optimistic Lock Valid: " + lock.validate(stamp)); sleep(1); System.out.println("Optimistic Lock Valid: " + lock.validate(stamp)); sleep(2); System.out.println("Optimistic Lock Valid: " + lock.validate

[高并发Java 十] JDK8对并发的新支持

吃可爱长大的小学妹 提交于 2019-12-01 09:46:46
1. LongAdder 和AtomicLong类似的使用方式,但是性能比 AtomicLong更好。 LongAdder与 AtomicLong都是使用了原子操作来提高性能。但是 LongAdder在 AtomicLong的基础上进行了热点分离,热点分离类似于有锁操作中的 减小锁粒度 ,将一个锁分离成若干个锁来提高性能。在无锁中,也可以用类似的方式来增加CAS的成功率,从而提高性能。 LongAdder原理图: AtomicLong的实现方式是内部有个value 变量,当多线程并发自增,自减时,均通过CAS 指令从机器指令级别操作保证并发的原子性。唯一会制约AtomicLong高效的原因是高并发,高并发意味着CAS的失败几率更高, 重试次数更多,越多线程重试,CAS失败几率又越高,变成恶性循环,AtomicLong效率降低。 而 LongAdder 将把一个value拆分成若干cell,把所有cell加起来,就是value。所以对 LongAdder进行加减操作,只需要对不同的cell来操作,不同的线程对不同的cell进行CAS操作,CAS的成功率当然高了(试想一下3+2+1=6,一个线程3+1,另一个线程2+1,最后是8, LongAdder没有乘法除法的API ) 。 可是在并发数不是很高的情况,拆分成若干的cell,还需要维护cell和求和,效率不如