`
123003473
  • 浏览: 1061069 次
  • 性别: 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
分享到:
评论

相关推荐

    Java并发中的线程安全性

    3. **有条件线程安全(Conditionally Thread-Safe)**:在某些特定条件下才能保证线程安全。 4. **线程不安全(Not Thread-Safe)**:在多线程环境下使用时需要外部同步机制来保证其正确性。 5. **无状态(Stateless...

    Java线程使用教程

    1. **线程不安全的类**:如`ArrayList`在并发环境下易引发数据不一致问题,应使用`ConcurrentHashMap`等线程安全的集合类。 2. **volatile关键字**:确保共享变量对所有线程可见,但不保证原子性。 通过学习这个...

    java线程安全总结.pdf

    6. **并发容器**:Java集合框架中的某些容器,如`ConcurrentHashMap`、`CopyOnWriteArrayList`和`CopyOnWriteArraySet`等,已经内置了线程安全机制,可以在高并发场景下高效地工作。 7. **线程池**:`...

    Java多线程与线程安全实践-基于Http协议的断点续传.zip

    线程之间需要共享当前的下载进度,这可以通过使用ConcurrentHashMap或者AtomicLong等线程安全的数据结构来实现。在下载过程中,线程会根据“Range”头信息向服务器发送请求,服务器返回相应部分的数据。 为了确保...

    java线程实战手册

    9. **并发集合**:Java提供了如ConcurrentHashMap、CopyOnWriteArrayList等并发安全的集合类,它们在多线程环境下提供了高效且线程安全的数据操作。 10. **原子变量类**:AtomicInteger、AtomicLong等原子变量类...

    java多线程编程(第二版)

    此外,ConcurrentHashMap是一种线程安全的哈希表,比传统的synchronized HashMap在性能上有所提升。 死锁是多线程编程中的一种常见问题,发生在两个或更多线程相互等待对方释放资源,从而导致所有线程都无法继续的...

    多线程Demo

    使用CopyOnWriteArrayList、ConcurrentHashMap等线程安全的集合类能解决这个问题。 2. **volatile关键字**:保证变量对所有线程可见,但不能保证原子性。对于简单读写操作的变量,使用volatile可以替代synchronized...

    线程面试汇总.docx

    - **并发容器**则是使用更高效的锁分段技术和无锁编程技术实现线程安全的容器,如`ConcurrentHashMap`、`CopyOnWriteArrayList`等。 ### 多线程的优缺点 - **优点**:提高系统的利用率和响应速度;更好地利用多核...

    多线程,runtime测试demo

    6. **线程安全的数据结构**:可能会使用`ConcurrentHashMap`、`AtomicInteger`等并发安全的类,确保在多线程环境下数据的一致性。 7. **线程状态和生命周期**:可能通过示例展示线程的五种基本状态(新建、就绪、...

    Java多线程编程

    9. **并发容器**:Java并发包提供了线程安全的容器,如`ConcurrentHashMap`、`CopyOnWriteArrayList`等,它们在多线程环境下保证了数据的一致性和正确性,减少了同步的开销。 10. **线程优先级**:Java中的线程有...

    深入Java多线程和并发编程

    为了保证线程安全性,可以考虑使用`Collections.synchronizedList`、`ConcurrentHashMap`等线程安全的容器替代。 综上所述,Java多线程与并发编程是一个既复杂又重要的领域。通过对核心概念和技术的深入理解与应用...

    超实用的Java并发多线程教程

    1. Java并发集合:为了在多线程环境下保证数据一致性,Java提供了线程安全的集合类,如`ConcurrentHashMap`、`CopyOnWriteArrayList`等。 2. `Atomic`类:如`AtomicInteger`、`AtomicLong`等,它们提供了原子操作,...

    多线程程序开发

    例如,线程安全的集合(如Java的ConcurrentHashMap)可以在多线程环境中保证数据一致性。线程局部存储(Thread Local Storage)则为每个线程提供独立的数据副本,避免了共享状态的冲突。 在实际应用中,合理地设计...

    java核心知识点学习----多线程间的数据共享和对象独立,ThreadLocal详解.pdf

    为了确保安全,可以使用ConcurrentHashMap,它提供了线程安全的并发操作。 2. **ThreadLocal详解**: ThreadLocal是Java提供的一种线程局部变量,每个线程都拥有自己独立的ThreadLocal副本,互不影响。在上述代码...

    java多线程和并发.pdf

    同步容器类使用同步锁来保证线程安全,但可能会影响性能。并发容器类ConcurrentHashMap和CopyOnWriteArrayList等,采用细粒度的锁和弱一致性来减少锁的竞争,提高并发访问效率。 线程池是管理线程生命周期的重要...

    java多线程并发实战和源码

    这些容器内部实现了线程安全的算法,能够在高并发环境下提供高效的数据访问。 此外,Java并发工具类(java.util.concurrent包)提供了许多实用的工具,如ExecutorService、Future、CountDownLatch、CyclicBarrier和...

    Java中的多线程共15页.pdf.zip

    线程安全的集合类,如Vector、Collections.synchronizedList()、ConcurrentHashMap等,也是Java多线程编程中常用的数据结构。它们内部实现了同步机制,可以在多线程环境下安全地访问和修改数据。 此外,Java的并发...

    Java线程及多线程技术及应用

    在编写多线程程序时,还需要关注线程安全的数据结构,例如 `ConcurrentHashMap`、`CopyOnWriteArrayList` 等,它们在设计时就考虑到了多线程环境下的并发访问。 此外,Java 提供了线程通信的工具类,如 `Object` 的...

    多线程编程指南

    - 使用并发工具类如`ConcurrentHashMap`等替代传统的集合类以提高线程安全性。 #### 四、高级多线程技术 1. **线程池:** - 线程池是一种复用固定数量线程的机制,可以减少创建和销毁线程的开销。 - Java中的`...

Global site tag (gtag.js) - Google Analytics