HashMap与Hashtable的线程安全性验证

    xiaoxiao2023-03-25  6


    相信大家都了解,HashMap是线程不安全的,而Hashtable是线程安全的,因为它的所有CRUD操作都被synchronized修饰,这种实现是十分缓慢的。


    下面解释一下什么是线程安全,什么是线程不安全。 线程安全:所谓线程安全简单的讲就是控制多个线程对某个资源的有序访问或修改。就是多线程访问时,采用了加锁机制,当一个线程访问该类的某个数据时,进行保护,其他线程不能进行访问直到该线程读取完,其他线程才可使用。不会出现数据不一致或者数据污染。 线程不安全:线程不安全就是不提供数据访问保护,有可能出现多个线程先后更改数据造成所得到的数据是脏数据

    具体的hashmap和hashtable是怎样实现线程安全和线程不安全: [译]Java HashMap原理探究 深入Java集合学习系列:Hashtable的实现原理

    下面就用代码验证下他们的线程安全性

    public class Xiancheng { static Hashtable<Integer, Integer> table = new Hashtable<>(); //分别在两个子线程内对hashtable进行put,get操作 public static void main(String[] args) { new Thread(new Runnable() { @Override public void run() { // TODO Auto-generated method stub System.out.println("线程1执行"); for (int i = 0; i < 1000; i++) { table.put(i,i); } System.out.println("线程1---------" + table.get(500)); } }).start(); new Thread(new Runnable() { @Override public void run() { // TODO Auto-generated method stub System.out.println("线程2执行"); for (int i = 1000; i < 2000; i++) { table.put(i, i); } System.out.println("线程2---------" + table.get(1500)); } }).start(); } }

    执行多次输出结果:

    线程1执行 线程2执行 线程1---------500 线程2---------1500 线程1执行 线程1---------500 线程2执行 线程2---------1500 线程1执行 线程2执行 线程1---------500 线程2---------1500

    因为Hashtable是线程安全的,可以看出,hashtable进行get的值都是正确的。

    下面看一下HashMap的情况:

    public class Xiancheng { static HashMap<Integer, Integer> map = new HashMap<>(); //分别在两个子线程内对hashmap进行put,get操作 public static void main(String[] args) { new Thread(new Runnable() { @Override public void run() { // TODO Auto-generated method stub System.out.println("线程1执行"); for (int i = 0; i < 1000; i++) { map.put(i,i); } System.out.println("线程1---------" + map.get(500)); } }).start(); new Thread(new Runnable() { @Override public void run() { // TODO Auto-generated method stub System.out.println("线程2执行"); for (int i = 1000; i < 2000; i++) { map.put(i, i); } System.out.println("线程2---------" + map.get(1500)); } }).start(); } }

    执行多次输出结果:

    线程1执行 线程2执行 线程1---------null 线程2---------1500 线程1执行 线程2执行 线程1---------500 线程2---------1500 线程1执行 线程2执行 线程1---------null 线程2---------null

    可以看出HashMap有出现脏数据的情况,所以HashMap是线程不安全的。

    转载请注明原文地址: https://ju.6miu.com/read-1203471.html
    最新回复(0)