一、HashTable
HashTable内部的方法都是以synchronized修饰的,是线程安全的
- 这里的线程安全是指,多个线程调用它们同一个实例的某个方法时,是线程安全的,也可以理解为
HashTable table=new HashTable();
new Thread(()->{
table.put("key","value1");
}).start();
new Thread(()->{
table.put("key","value2");
}).start();
- 它们的每个方法是原子的
但注意
它们多个方法的组合不是原子的,见后面分析
1.1 线程安全类方法的组合
HashTable table=new HashTable();
//线程1,线程2都来执行
if(table.get("key") == null{
table.put("key",value);
}
会导致数据被覆盖问题,此时就不是线程安全的
加了锁之后只能保证同一个对象不会被不同线程同时访问到,但是不能保证get和put的执行顺序
虽然线程安全类中的每一个方法
都可以保证原子性
,但是它们方法的组合不能保证原子性
,若想让它们的组合也保证原子性
,在外层再加线程安全的保护
总结
完