HashMap 多线程下线程不安全案例

 首先说下这个问题:今天线上报了一个空指针,上线了3年,第一次出现空指针的问题,看了下原来的代码,是向一个HashMap中保存一个变量,后面的代码会 从HashMap中获取这个值,由于HashMap不是线程安全的,所以可能出现此类问题,以下是代码的案例演示,可以看到虽然设置了值,但是在多线程下获取到的值还是null,当然这个并不是每次都会复现,多运行几次,就会出现为null的情况,将HashMap更换为ConcurrentMap,即可解决这个问题.

import com.google.common.collect.Maps;

import java.util.Map;
import java.util.Random;

public class ThreadLocal {
    private static transient Map<Thread, Integer> map;

    public static void main(String[] args) {
        map = Maps.newHashMap();
        for (int i = 0; i < 10; i++) {
            new Thread(() -> {
                int data = new Random().nextInt();
                map.put(Thread.currentThread(), data);
                System.out.println(Thread.currentThread() + ", data:" + data);
                new A().show();
                new B().show();
            }).start();
        }
    }

    static class A {
        public void show() {
            System.out.println(Thread.currentThread() + "调用A, data:" + map.get(Thread.currentThread()));
        }
    }

    static class B {
        public void show() {
            System.out.println(Thread.currentThread() + "调用B, data:" + map.get(Thread.currentThread()));
        }
    }
}

 

 

 

您还没有登录,请先 登录或者 注册后,添加评论
公告栏
当前开发版本 2.1.0
  • 公告栏展示
  • 打赏功能添加
  • 消息系统后端支持(回复,删除,读取)
  • 支持RSS
赞助开发

支持下作者

您的支持是我们最大的动力

...
狸猫
友情链接
INAG工具库
热门文章
最近发表