- 浏览: 1042084 次
- 性别:
- 来自: 南京
文章分类
- 全部博客 (501)
- dwr (6)
- javascript (84)
- oracle (66)
- jsp/servlet (18)
- ant (3)
- 基础知识 (12)
- EXT (10)
- My SQL (10)
- java (71)
- spring (37)
- 学习的对象 (2)
- Linux (24)
- 面试 (1)
- HTML/CSS (11)
- tomcat (11)
- 收藏夹 (2)
- Power Designer (2)
- struts.xml配置文件 (1)
- sturts2 (3)
- myeclipse (8)
- eclipse (7)
- Maven (34)
- SVN (3)
- SAP JCO (2)
- JBOSS (11)
- webservice (8)
- word (1)
- 敏捷开发 (1)
- sybase (4)
- Nexus (3)
- EhCache (3)
- log4j (3)
- Cookie (4)
- Session (4)
- CXF (7)
- AXIS (2)
- SSO (1)
- LDAP (1)
- velocity (2)
- Jquery (5)
- redis (2)
- http (4)
- dojo (1)
- Linux资源监控软件mnon的安装与运用 (1)
- notepad++ (1)
- EA (1)
- UML (1)
- JasperReports (1)
- 权限 (0)
- freemarker (4)
- Spring MVC (1)
- JMS (1)
- activeMQ (1)
- hession (3)
- 安全 (1)
- ibatis (2)
- log (1)
- nginx (1)
最新评论
-
winhbb:
我刚好遇到了一个问题(在可以依赖注入的场合有效):有两个模块A ...
解决Maven项目相互依赖/循环依赖/双向依赖的问题 -
nanjiwubing123:
long3ok 写道你好 XmlOutputFormatter ...
用XStream转换复杂XML -
zhoujianboy:
另外一个方法实现eclipse tomcat 热部署:http ...
eclipse下实现maven项目在tomcat容器热部署方法 -
long3ok:
你好 XmlOutputFormatter 请问这个类是在什么 ...
用XStream转换复杂XML -
ganbo:
总结的好,文章给力。
解决Maven项目相互依赖/循环依赖/双向依赖的问题
怎么使用 ConcurrentHashMap 才能是线程安全的?
- 博客分类:
- java
public class test { public static ConcurrentHashMap chm = new ConcurrentHashMap(); public static void main(String[] args) { for(int i=1;i<100;i++) { th t = new th(i); t.start(); } } } class th extends Thread { private int number = 0; public th(int _number) { number = _number; } @Override public void run() { boolean bo = true; while(bo){ int state = test.chm.get("test") == null ? 0 : (Integer)test.chm.get("test"); if(state == 9 ) { System.out.println("线程:"+number+",停止!"); bo = false ; }else { state = (int)(Math.random() * 100); test.chm.put("test", state); System.out.println("线程:"+number+",修改操作,状态="+state); } } } }
今天做了下测试,100个并发,通过ConcurrentHashMap 来存储数据来保证线程安全,
正确测试结果就是当一个线程随机数为9的时候,所有线程停止工作,但多执行几次还会发现,并发访问时,一个线程改变state为9,后其他线程还有继续在工作的.
线程:1,修改操作,状态=1
线程:2,修改操作,状态=9
线程:4,修改操作,状态=81
线程:6,停止!
线程:3,停止!
线程:8,停止!
线程:10,停止!
线程:7,停止!
检查了下 是多个线程执行到else里面时,state已经被之前的线程改为9了 ,造成的,说白了就是修改state=9这个线程在put之前,其他多个线程已经从map里读取stage的数据了,所以当state改成9,这些线程还可以执行else里面代码,并且将state又改成其他数了.
我可以通过同步代码块解决这问题,但就没有使用ConcurrentHashMap 的必须要了hashmap也可以做到.不知道是否我是ConcurrentHashMap 有问题?
ConcurrentHashMap 只是保证本身map的线程安全,不保证你自己写的程序的同步.
你可以采用客户端加锁实现同步
synchronized(test.chm)
转载地址:http://www.oschina.net/question/236000_71020
发表评论
-
个人草稿使用
2017-08-19 09:02 0深入理解JVM: http://www.cnblogs.co ... -
Thread.setDaemon详解
2015-04-24 21:31 850java中线程分为两种类型:用户线程和守护线程。通过Threa ... -
21,tomcat关闭钩子
2014-12-31 10:36 687在很多环境下,在关闭应用程序的时候需要做一些清理工作。问题在于 ... -
Java NIO使用及原理分析 (一) 【转载】
2014-10-24 00:04 454【转载】: http://blog.csdn.net/wuxi ... -
Java 两个集合取交集
2014-10-14 21:16 3073public static Set intersectionS ... -
Calendar类roll和add的区别
2014-10-10 22:28 448import java.text.SimpleDateForm ... -
Gson通过借助TypeToken获取泛型参数的类型的方法
2014-09-30 00:26 595[size=medium]最近在使用Goo ... -
HashMap的遍历效率讨论
2014-09-27 20:41 793经常遇到对HashMap中的key和value值对的遍历操作, ... -
Java 泛型
2014-06-26 12:44 820关键字说明 ? 通配符类型 <? extends T&g ... -
Java泛型集合的理解
2014-06-26 00:05 463[size=medium]什么是泛型? 泛型(Generic ... -
关于java字节码框架ASM的学习
2014-06-19 19:22 843一、什么是ASM ASM是一个java字节码操纵框架, ... -
Java动态代理详解
2014-06-19 17:41 816Java动态代理详解: http: ... -
Java内存,字符串文章收集
2014-06-18 16:24 672java--String常量池问题的几个例子 . http:/ ... -
Java内存解析
2014-06-18 11:48 741栈、堆、常量池等虽同 ... -
Java的堆与非堆内存
2014-01-07 10:59 682堆(Heap)和非堆(Non-heap)内存 按照官方的说法: ... -
JMX 资料收集
2014-01-07 10:53 393JavaSky的专栏 http://blog.csdn.net ... -
JAVA 注解示例 详解
2013-11-12 09:36 780注解(Annotation) 为我们在代码中天界信息提供了 ... -
Java 泛型详解
2013-11-11 22:35 758http://www.360doc.com/content/1 ... -
Java中的Enum的使用与分析
2013-11-09 12:49 782enum枚举类型:在实际问 ... -
Js中escape(),encodeURI()和encodeURIComponent()使用和比较:
2013-09-12 09:42 997Js中escape(),encodeURI()和encodeU ...
相关推荐
阿里面试题:ConcurrentHashMap为什么是线程安全的? ConcurrentHashMap,其实是线程安全的HashMap,所以阅读ConcurrentHashMap,建议 先阅读一下两篇介绍HashMap的文章 你真的懂大厂面试题:HashMap吗? jdk1.7 ...
经常会看到说HashMap是线程不安全的,ConcurrentHashMap是线程安全的等等说法,不禁有个疑问,什么是线程安全?什么样的类是线程安全的? 1.什么是线程安全性(what) 线程安全定义,最核心是正确性, 正确性:多个...
【面试普通人VS高手系列】ConcurrentHashMap 底层具体实现知道吗?实现原理是什么?.doc
介绍完整的,算是个开胃菜吧,类似CAS等更加底层的机制,后面会在Java进阶模块中的并发主题有更加系统的介绍。知识扩展1. 为什么需要 ConcurrentHa
HashTable是一个线程安全的类,它使用synchronized来锁住整张Hash表来实现线程安全,即每次锁住整张表让线程独占,相当于所有线程进行读写时都去竞争一把锁,导致效率非常低下。ConcurrentHashMap可以做到读取数据不...
线程安全和线程不安全的分别有哪些? Map接口有哪些实现类? 描述一下Map put的过程 如何得到一个线程安全的Map? HashMap有什么特点? ConcurrentHashMap是怎么分段分组的? ConcurrentHashMap是怎么分段分组的? ...
需要注意的是,在使用ConcurrentHashMap时,并发更新和迭代操作可能会导致一些问题,因为在操作过程中其他线程可能会修改数据。因此,如果需要保证精确的操作顺序或避免并发更新带来的问题,可以考虑使用更高级的...
如果我么需要有一个线程安全的HashMap,可以使用Collections.synchronizedMap(Map m)方法获得线程安全的HashMap,也可以使用ConcurrentHashMap类创建线程安全的map。 存储的元素在jdk1.7当中是Entry作为存储的
如何使用 ConcurrentHashMap 类来实现线程安全的映射? 如何避免在多线程环境下对同一集合的并发修改? 如何使用 PriorityQueue 类实现一个最小堆? 如何使用 LinkedHashSet 类来实现 LRU 缓存? 如何使用 Stream ...
ConcurrentHashMap具体是怎么实现线程安全的呢,肯定不可能是每个方法加synchronized,那样就变成了HashTable。
计算机技术、IT咨询、人工智能AI理论介绍,学习参考资料 计算机技术、IT咨询、人工智能AI理论介绍,学习参考资料 计算机技术、IT咨询、人工智能AI理论介绍,学习参考资料 计算机技术、IT咨询、人工智能AI理论介绍,...
ConcurrentHashMap是J.U.C(java.util.concurrent包)的重要成员,它是HashMap的一个线程安全的、支持高效并发的版本。在默认理想状态下,ConcurrentHashMap可以支持16个线程执行并发写操作及任意数量线程的读操作。...
13.HashMap为什么不直接使用hashCode()处理后的哈希值直接作为table的下标? 14.HashMap 的长度为什么是2的幂次方? 15.HashMap 与 HashTable 有什么区别? 16.如何决定使用 HashMap 还是 TreeMap? 17.HashMap 和 ...
Java利用ConcurrentHashMap实现本地缓存demo; 基本功能有缓存有效期、缓存最大数、缓存存入记录、清理线程、过期算法删除缓存、LRU算法删除、获取缓存值等功能。 复制到本地项目的时候,记得改包路径哦~
ConcurrentHashMap是如何在保证并发安全的同时提高性能? ConcurrentHashMap是如何让多线程同时参与扩容? LinkedBlockingQueue、DelayQueue是如何实现的? CopyOnWriteArrayList是如何保证线程安全的?
java源码剖析-ConcurrentHashMap
解析concurrenthashmap的源码,学习多线程的思想
ConcurrentHashMap是一个线程安全的HashTable,它的主要功能是提供了一组和HashTable功能相同但是线程安全的方法。ConcurrentHashMap可以做到读取数据不加锁,并且其内部的结构可以让其在进行写操作的时候能够将锁的...
ConcurrentHashMap源码剖析
HashMap是线程不安全的,并允许null key 和 null value。 HashMap在我当前的jdk版本(11)的默认容量为0,在第一次添加元素的时候才初始化容量为 16, 之后才扩容为原来的2倍。 HashMap的扩容是根据 threshold决定的 : ...