为什么hashtable的读取加锁 currenthashmap读取可以不加锁

hashtable 是通过synchronized 锁的方式 保证可见性

currenthashmap 是通过 volite 关键字保证可见性

猜想

hashtable是通过 读写 互斥来保证数据安全的 那么 如果我们在使用currenthashmap 时 当

线程A 正在put 数据 还没写入完成  这时候线程B去读取 现在A 还没写入完成的数据 能够正常读取出数据吗   还是发生阻塞  如果能够正常读取数据 那么读取的数据是线程A还没写入完成的数据 是否属于线程不安全 

测试代码

public static void main(String[] args) {
    ConcurrentHashMap<String, String> stringStringConcurrentHashMap = new ConcurrentHashMap<>();

    stringStringConcurrentHashMap.put("123","456");
    new  Thread(new Runnable() {
        @Override
        public void run() {
            System.out.println(Thread.currentThread().getName()+": put 789 ing");
            stringStringConcurrentHashMap.put("123","789");
            System.out.println(Thread.currentThread().getName()+":get "+stringStringConcurrentHashMap.get("123"));
        }
    },"t1").start();

    new  Thread(new Runnable() {
        @Override
        public void run() {
            try {
                Thread.sleep(500l);
            } catch (InterruptedException e) {
                e.printStackTrace();
            }
            System.out.println(Thread.currentThread().getName()+":get "+stringStringConcurrentHashMap.get("123"));
        }
    },"t2").start();
}

我们通过IDE的线程调试 设置 t1线程  put阻塞

 

 测试 运行

可以正常读取 并且可以读取未put完成之前的数据

总结:currenthashmap允许读取未put完成的数据 只是通过volite保证读取最新值 不能解决读取过期数据问题

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值