`
123003473
  • 浏览: 1042084 次
  • 性别: Icon_minigender_1
  • 来自: 南京
社区版块
存档分类
最新评论

怎么使用 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
分享到:
评论

相关推荐

    阿里面试题:ConcurrentHashMap为什么是线程安全的?

    阿里面试题:ConcurrentHashMap为什么是线程安全的? ConcurrentHashMap,其实是线程安全的HashMap,所以阅读ConcurrentHashMap,建议 先阅读一下两篇介绍HashMap的文章 你真的懂大厂面试题:HashMap吗? jdk1.7 ...

    【并发】为什么HashMap是线程不安全的?

    经常会看到说HashMap是线程不安全的,ConcurrentHashMap是线程安全的等等说法,不禁有个疑问,什么是线程安全?什么样的类是线程安全的? 1.什么是线程安全性(what) 线程安全定义,最核心是正确性, 正确性:多个...

    【面试普通人VS高手系列】ConcurrentHashMap 底层具体实现知道吗?实现原理是什么?.doc

    【面试普通人VS高手系列】ConcurrentHashMap 底层具体实现知道吗?实现原理是什么?.doc

    第10讲 如何保证集合是线程安全的 ConcurrentHashMap如何实现高效地线程安全1

    介绍完整的,算是个开胃菜吧,类似CAS等更加底层的机制,后面会在Java进阶模块中的并发主题有更加系统的介绍。知识扩展1. 为什么需要 ConcurrentHa

    Java并发编程笔记之ConcurrentHashMap原理探究.docx

    HashTable是一个线程安全的类,它使用synchronized来锁住整张Hash表来实现线程安全,即每次锁住整张表让线程独占,相当于所有线程进行读写时都去竞争一把锁,导致效率非常低下。ConcurrentHashMap可以做到读取数据不...

    java集合类原理面试题

    线程安全和线程不安全的分别有哪些? Map接口有哪些实现类? 描述一下Map put的过程 如何得到一个线程安全的Map? HashMap有什么特点? ConcurrentHashMap是怎么分段分组的? ConcurrentHashMap是怎么分段分组的? ...

    java集合-ConcurrentHashMap的使用

    需要注意的是,在使用ConcurrentHashMap时,并发更新和迭代操作可能会导致一些问题,因为在操作过程中其他线程可能会修改数据。因此,如果需要保证精确的操作顺序或避免并发更新带来的问题,可以考虑使用更高级的...

    HashMap如何添加元素详解

    如果我么需要有一个线程安全的HashMap,可以使用Collections.synchronizedMap(Map m)方法获得线程安全的HashMap,也可以使用ConcurrentHashMap类创建线程安全的map。 存储的元素在jdk1.7当中是Entry作为存储的

    Java 集合方面的面试题

    如何使用 ConcurrentHashMap 类来实现线程安全的映射? 如何避免在多线程环境下对同一集合的并发修改? 如何使用 PriorityQueue 类实现一个最小堆? 如何使用 LinkedHashSet 类来实现 LRU 缓存? 如何使用 Stream ...

    ConcurrentHashMap源码分析

    ConcurrentHashMap具体是怎么实现线程安全的呢,肯定不可能是每个方法加synchronized,那样就变成了HashTable。

    面试阿里被质问:ConcurrentHashMap线程安全吗.zip

    计算机技术、IT咨询、人工智能AI理论介绍,学习参考资料 计算机技术、IT咨询、人工智能AI理论介绍,学习参考资料 计算机技术、IT咨询、人工智能AI理论介绍,学习参考资料 计算机技术、IT咨询、人工智能AI理论介绍,...

    ConcurrentHashMap思维导图完整版

    ConcurrentHashMap是J.U.C(java.util.concurrent包)的重要成员,它是HashMap的一个线程安全的、支持高效并发的版本。在默认理想状态下,ConcurrentHashMap可以支持16个线程执行并发写操作及任意数量线程的读操作。...

    HashMap-面试必过

    13.HashMap为什么不直接使用hashCode()处理后的哈希值直接作为table的下标? 14.HashMap 的长度为什么是2的幂次方? 15.HashMap 与 HashTable 有什么区别? 16.如何决定使用 HashMap 还是 TreeMap? 17.HashMap 和 ...

    Java利用ConcurrentHashMap实现本地缓存demo

    Java利用ConcurrentHashMap实现本地缓存demo; 基本功能有缓存有效期、缓存最大数、缓存存入记录、清理线程、过期算法删除缓存、LRU算法删除、获取缓存值等功能。 复制到本地项目的时候,记得改包路径哦~

    集合常见面试题

    ConcurrentHashMap是如何在保证并发安全的同时提高性能? ConcurrentHashMap是如何让多线程同时参与扩容? LinkedBlockingQueue、DelayQueue是如何实现的? CopyOnWriteArrayList是如何保证线程安全的?

    java源码剖析-ConcurrentHashMap

    java源码剖析-ConcurrentHashMap

    ConcurrentHashMap源码解析

    解析concurrenthashmap的源码,学习多线程的思想

    Java并发编程之ConcurrentHashMap

    ConcurrentHashMap是一个线程安全的HashTable,它的主要功能是提供了一组和HashTable功能相同但是线程安全的方法。ConcurrentHashMap可以做到读取数据不加锁,并且其内部的结构可以让其在进行写操作的时候能够将锁的...

    ConcurrentHashMap源码剖析

    ConcurrentHashMap源码剖析

    Java集合教程吐血整理干货.md

    HashMap是线程不安全的,并允许null key 和 null value。 HashMap在我当前的jdk版本(11)的默认容量为0,在第一次添加元素的时候才初始化容量为 16, 之后才扩容为原来的2倍。 HashMap的扩容是根据 threshold决定的 : ...

Global site tag (gtag.js) - Google Analytics