第三种方式:通过 &$使用 遍历 C& 的 7 和
*C9 的锁是如何加的?是不是分段越多越好
答案:分段锁。X 方法不需要加锁,由于其中涉及到的共享变量都是使用
修饰, 可以保证内存可见性,所以不会读取到过期数据
*C9 哪些方法会加锁?
答案:
9 如果只有一个写其他全读会出什么问题
答案:会出现线程安全问题,因为 C& 不是线程安全的,当一个线程
写多个读的情况下有可能其他读的线程在某一时刻读取的数据是不一致的,
最好使用 *C& 或者 C<
' 9 求 B 是如何加锁的,如果刚求完一段后这段发生
了变化该如何处理
如果我们要统计整个 *C& 里元素的大小,就必须统计所有 $9 里元素的大小后求和。$9 里的全局变量 是
一个 变量,那么在多线程场景下,我们是不是直接把所有 $9 的 相加就可以得到整个 *C& 大小了呢?不
是的,虽然相加时可以获取每个 $9 的 的最新值,但是拿到之后可能累加前使用的 发生了变化,那么统计结果就不准了。所
以最安全的做法,是在统计 B 的时候把所有 $9 的 ,9 和 方法全部锁住,但是这种做法显然非常低效。
因为在累加 操作过程中,之前累加过的 发生变化的几率非常小,所以 *C& 的做法是先尝试 次通过不锁住
$9 的方式来统计各个 $9 大小,如果统计的过程中,容器的 发生了变化,则再采用加锁的方式来统计所有 $9 的大小。
那么 *C& 是如何判断在统计的时候容器是否发生了变化呢?使用 9* 变量,在 "9 和 方法里操作元
素前都会将变量 9* 进行加 ,那么在统计 B 前后比较 9* 是否发生变化,从而得知容器的大小是否发生变化。
) A7C9 的底层实现
LinkedHashMap,见名知义,带链表的 HashMap, 所以 LinkedHashMap 是有
序,LinkedHashMap 作为 HashMap 的扩展,它改变了 HashMap 无序的特征。