
转载自: https://mp.weixin.qq.com/s/f23I1kyJQoNPu6Ntrx0S6g
读后感:
Java1.6为Synchronized做了优化,增加了从偏向锁到轻量级锁再到重量级锁的过度,但是在最终转变为重量级锁之后,性能仍然较低. 这其中用到了CAS机制。
CAS优点
- Synchronized属于悲观锁,悲观地认为程序中的并发情况严重,所以严防死守。CAS属于乐观锁,乐观地认为程序中的并发情况不那么严重,所以让线程不断去尝试更新。
- 避免了context switch
CAS缺点
- CPU消耗较大,不适合高并发场景(因为冲突太多,失败率高)。
- ABA问题
- 不能保证代码块的原子性。例如不能保证多个变量同时更新.
乐观锁转悲观锁的经典代码见:ConcurrentHashMap的size方法
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39
|
public int () { final Segment<K,V>[] segments = this.segments; int size; boolean overflow; long sum; long last = 0L; int retries = -1; try { for (;;) { if (retries++ == RETRIES_BEFORE_LOCK) { for (int j = 0; j < segments.length; ++j) ensureSegment(j).lock(); } sum = 0L; size = 0; overflow = false; for (int j = 0; j < segments.length; ++j) { Segment<K,V> seg = segmentAt(segments, j); if (seg != null) { sum += seg.modCount; int c = seg.count; if (c < 0 || (size += c) < 0) overflow = true; } } if (sum == last) break; last = sum; } } finally { if (retries > RETRIES_BEFORE_LOCK) { for (int j = 0; j < segments.length; ++j) segmentAt(segments, j).unlock(); } } return overflow ? Integer.MAX_VALUE : size; }
|
近期评论