1.7 size() 首先CAS比较下当前获取的分段锁所获取总数量 是否等于用于监控数量,、是的话每人等,开始就直接统计了
2,如果不相等的话 就锁着所有的segment 的读和写,开始统计
1.8size()
定义了一个全局的数组 counterCells[] ,couterCells 是个内部类,有一个valitle的value变量,构造函数把valitle传进去!
public int size() {
long n = sumCount();
return ((n < 0L) ? 0 :
(n > (long)Integer.MAX_VALUE) ? Integer.MAX_VALUE :
(int)n);
}
final long sumCount() {
CounterCell[] as = counterCells; CounterCell a;
long sum = baseCount;
if (as != null) {
for (int i = 0; i < as.length; ++i) {
if ((a = as[i]) != null)
sum += a.value;
}
}
return sum;
}
所以counterCells存储的都是value为1的CounterCell对象,而这些对象是因为在CAS更新baseCounter值时,由于高并发而导致失败,最终将值保存到CounterCell中,放到counterCells里。这也就是为什么sumCount()中需要遍历counterCells数组,sum累加CounterCell.value值了
网友评论