sentinel里的双检锁
生活随笔
收集整理的這篇文章主要介紹了
sentinel里的双检锁
小編覺得挺不錯的,現在分享給大家,幫大家做個參考.
單例模式有很多種,餓漢式,懶漢式,雙檢鎖,公司里大部分都是選擇了雙檢鎖,其中sentinel的ContextUtil源碼里就有相關的實現:
protected static Context trueEnter(String name, String origin) {Context context = contextHolder.get();if (context == null) {Map<String, DefaultNode> localCacheNameMap = contextNameNodeMap;DefaultNode node = localCacheNameMap.get(name);if (node == null) {if (localCacheNameMap.size() > Constants.MAX_CONTEXT_NAME_SIZE) {setNullContext();return NULL_CONTEXT;} else {try {LOCK.lock();node = contextNameNodeMap.get(name);if (node == null) {if (contextNameNodeMap.size() > Constants.MAX_CONTEXT_NAME_SIZE) {setNullContext();return NULL_CONTEXT;} else {node = new EntranceNode(new StringResourceWrapper(name, EntryType.IN), null);// Add entrance node.Constants.ROOT.addChild(node);Map<String, DefaultNode> newMap = new HashMap<>(contextNameNodeMap.size() + 1);newMap.putAll(contextNameNodeMap);newMap.put(name, node);contextNameNodeMap = newMap;}}} finally {LOCK.unlock();}}}context = new Context(node, name);context.setOrigin(origin);contextHolder.set(context);}return context;}上述代碼使用了雙檢鎖,lock后進行再判斷,可以很好的防止多并發問題。
總結
以上是生活随笔為你收集整理的sentinel里的双检锁的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: java里的主线程和子线程以及final
- 下一篇: java中动态顺序死锁问题