源码里的volatile难道不是为了防止new HashMap可能会发生指令重排序现象吗?

来源:1-12 哨兵核心源码主流程分析-2

techa

2020-08-02 16:33:20

private static volatile Map<ResourceWrapper, ProcessorSlotChain> chainMap
   = new HashMap<ResourceWrapper, ProcessorSlotChain>();

// 源码

synchronized (LOCK) {

   chain = chainMap.get(resourceWrapper);
   if (chain == null) {
       // Entry size limit.
       if (chainMap.size() >= Constants.MAX_SLOT_CHAIN_SIZE) {
           return null;
       }

       chain = SlotChainProvider.newSlotChain();
       Map<ResourceWrapper, ProcessorSlotChain> newMap = new HashMap<ResourceWrapper, ProcessorSlotChain>(
           chainMap.size() + 1);
       newMap.putAll(chainMap);
       newMap.put(resourceWrapper, chain);
       chainMap = newMap;
   }
}

写回答

2回答

阿神

2020-08-02

说错了map  size的 可见性

0
hr_Raymond
h 借楼问一下阿神老师, 这里不是已经加锁了吗? 没有volatile, chainMap.size()方法也不会有问题吧?
h020-08-24
共1条回复

阿神

2020-08-02

是为了保证 hashmap的 size原子性

0

Java架构师-技术专家

千万级电商项目从0到100全过程,覆盖Java程序员不同成长阶段的核心问题与解决方案

2672 学习 · 5839 问题

查看课程