线程安全

对象的状态:对象状态不只和自身有关,还可能和自身的元素有关,如HashMap和内部的Entry

线程安全就是程序能够在多线程下正确的执行,如果在多线程执行某段代码出现错误,以下几个方面都可能影响线程安全:

  • 变量可共享
  • 变量可修改
  • 访问修改变量是否使用同步机制

竞态条件

当代码的正确性需要取决于多线程的执行时序的时候,就会发生竞态条件,此时结果是不确定的。

通常是先检查再修改的情况,如 i++、或者对象延迟初始化(先判断对象为null,然后创建对象)。

合理使用synchronized

我们可以用synchronized限制临界区代码被多线程同时访问,但是同时也会有一些问题:

  • 线程安全类的不安全使用:如先检查vector集合内是否有某个元素,没有进行添加,虽然vector是线程安全类,但是方法组合同样会发生竞态条件
  • 性能问题:锁的粒度太大,直接对整个方法加锁;或者在一些耗时较长的地方加锁(如I/O等)