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保证读取最新值 不能解决读取过期数据问题