美文网首页
9-多线程中集合类的问题

9-多线程中集合类的问题

作者: 加碘盐_ed6c | 来源:发表于2018-05-06 16:24 被阅读0次

诡异的HashMap

在JDK中,我们有很丰富的的已经写好的类库区使用,其中使用最多的就是集合类的,集合类中提供了Collection接口,List,Map等接口以及ArratList,LinkedList,HashMap等实现类。但是在并发中,我们并不能直接去使用这些实现类或者接口,因为这可能会造成一些问题,下面就是一个会造成问题的例子:

//并发下诡异的HashMap
public class Main {
    public static void main(String[] args) throws InterruptedException {
        Thread t1=new Thread(new HashTest.AddThread(0));
        Thread t2=new Thread(new HashTest.AddThread(1));
        t1.start();
        t2.start();
        t1.join();
        t2.join();
    }
}
class HashTest{
    static Map<String,String> map=new HashMap<String, String>();
    public static class AddThread implements Runnable{
        int start=0;
        public AddThread(int start){
            this.start=start;
        }
        public void run(){
            for(int i=start;i<10000;i+=2){
                map.put(Integer.toString(i),Integer.toBinaryString(i));
            }
        }
    }
}

这段代码看似没有问题,但是实际上有很大的问题,由于多线程的冲突问题,Map中的链表成环了,所以上述的迭代就成了死循环。key1和key2互为对方的next元素。

谨慎尝试,CPU占用率很可能达100%,可能导致死机

解决方案

JDK直接为我们解决了并发下容器类出现的问题,那就是JDK并发容器。他们大部分都存在java.util.concurrent这个包中。他们都有:

  • ConcurrentHashMap
  • CopyOnWriteArrayList
  • ConcurrentLinkedQueue
  • BlockingQueue
  • ConcurrentSkipListMap

使用方法也很简单,除了以上方式,还可以使用其他方法,下面举一个HashMap的例子:

public static Map m= Collections.synchronizedMap(new HashMap());

而且,List等也可以使用类似的方式去使其在并发下不出现问题。

相关文章

  • 9-多线程中集合类的问题

    诡异的HashMap 在JDK中,我们有很丰富的的已经写好的类库区使用,其中使用最多的就是集合类的,集合类中提供了...

  • 集合类与Java锁浅析

    集合类不安全问题 List ArrayList不是线程安全类,在多线程同时写的情况下,会抛出java.util.C...

  • 小编带你进SimpleDateFormat-多线程问题

    SimpleDateFormat-多线程问题: SimpleDateFormat类在多线程环境下中处理日期,极易出...

  • android 多线程 — 并发集合 CopyOnWriteAr

    本篇我们来看看集合在多线程环境下的新变化 在多线程中我们需要考虑任何数据对象的同步问题,使用率很高的集合类型对象也...

  • Java集合框架

    集合可以看作是一种容器,用来存储对象信息。所有集合类都位于java.util包下,支持多线程的集合类位于java....

  • python的多线程类变量共享

    问题说明 在同一个类中启动多线程的方法,和多线程执行的方法如果都在同一个类中,启动多线程时 通过self调用方法名...

  • java中的Atomic类

    java中的Atomic类 问题背景 在多线程环境中,我们最常遇到的问题就是变量的值进行同步。因为变量需要在多线程...

  • 集合类面试中的扩容问题

    首先,这三个概念说下。初始大小,就是创建时可容纳的默认元素个数;加载因子,表示某个阀值,用0~1之间的小数来表示,...

  • Java 学习路线

    JavaSE 基础语法 面向对象 异常处理 常用类(包装类、String) 集合框架及泛型 IO 流 多线程 网络...

  • 聊聊Java里常用的并发集合

    前言 在我们的程序开发过程中,如果涉及到多线程环境,那么对于集合框架的使用就必须更加谨慎了,因为大部分的集合类在不...

网友评论

      本文标题:9-多线程中集合类的问题

      本文链接:https://www.haomeiwen.com/subject/moeurftx.html