博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
ConcurrentHashMap并不是绝对线程安全的
阅读量:7123 次
发布时间:2019-06-28

本文共 2831 字,大约阅读时间需要 9 分钟。

import java.util.HashMap;import java.util.Map;import java.util.concurrent.ConcurrentHashMap;public class ConcurrentHashMapDemo1 {    private static Map
widgetCacheMap = new ConcurrentHashMap
(); /** * @param args */ public static void main(String[] args) { for (int i = 0; i < 10000; i++) { Thread tt = new Thread(new Rund()); tt.start(); } } static class Rund implements Runnable { public void run() { test(); } /** * 1W次,总有那么几次线程不安全 */ public void test() { synchronized ("") {
// 解决方案 ConcurrentHashMapDemo1 tt = new ConcurrentHashMapDemo1(); tt.set(); int s1 = widgetCacheMap.get(1L).intValue(); tt.change(); int s2 = widgetCacheMap.get(1L).intValue(); if (s1 == s2) { System.out.println(s1 + ":" + s2); } } } } public void set() { Map
mm = new HashMap
(); mm.put(1L, 1); widgetCacheMap = mm; } public void change() { Map
mm = new HashMap
(); mm.put(1L, 2); widgetCacheMap = mm; }}

 

import java.util.concurrent.ConcurrentHashMap;import java.util.concurrent.ExecutorService;import java.util.concurrent.Executors;import java.util.concurrent.TimeUnit;public class ConcurrentHashMapDemo2 {    public static void main(String[] args) throws InterruptedException {        for (int i = 0; i < 10; i++) {            System.out.println(test());        }    }    private static int test() throws InterruptedException {        ConcurrentHashMap
map = new ConcurrentHashMap
(); ExecutorService pool = Executors.newCachedThreadPool(); for (int i = 0; i < 8; i++) { pool.execute(new MyTask(map)); } pool.shutdown(); pool.awaitTermination(1, TimeUnit.DAYS); return map.get(MyTask.KEY); }}class MyTask implements Runnable { public static Object lock = new Object(); public static final String KEY = "key"; private ConcurrentHashMap
map; public MyTask(ConcurrentHashMap
map) { this.map = map; } @Override public void run() { for (int i = 0; i < 100; i++) { synchronized (lock) { // 解决方案 this.addup(); } } } private void addup() { if (!map.containsKey(KEY)) { map.put(KEY, 1); } else { map.put(KEY, map.get(KEY) + 1); } }}

总结:ConcurrentHashMap是线程安全的,那是在他们的内部操作,其外部操作还是需要自己来保证其同步的,特别是静态的ConcurrentHashMap,其有更新和查询的过程,要保证其线程安全,需要syn一个不可变的参数才能保证其原子性

转载地址:http://udael.baihongyu.com/

你可能感兴趣的文章
屌炸天,JDK8的排序大法!!
查看>>
android兼容oppo手机刘海屏解决方案
查看>>
html中让input标签只读不可编辑的方法
查看>>
IOS隐藏键盘
查看>>
代码为什么那么乱! 换种方法学面向对象
查看>>
WPF中动态添加控件,并为控制指定样式
查看>>
Aruba:物联网有望在2019年大规模应用
查看>>
区块链应用场景:征信和权属管理
查看>>
CES Asia专题|中国移动发布全球最小通信模组,助力物联网发展
查看>>
【MySql】赶集网mysql开发36条军规
查看>>
服务越好收入越高,300万快递小哥有了终身成长体系
查看>>
ipa-server
查看>>
2018云栖大会深圳峰会-企业级互联网架构专场看点提前大放送!
查看>>
邱剑 | 美团云容器实践之路
查看>>
windows 系统监视器 以及建议阀值
查看>>
bootstrap-表单控件——按钮
查看>>
[数据结构]约瑟夫环问题
查看>>
Spring系列之AOP分析之获取Advice的过程(四)
查看>>
CSS之浮动那些事
查看>>
BPM实例方案分享:表单子表自动填入数据
查看>>