简单了解线程安全
线程安全
对象的状态:对象状态不只和自身有关,还可能和自身的元素有关,如HashMap和内部的Entry
线程安全就是程序能够在多线程下正确的执行,如果在多线程执行某段代码出现错误,以下几个方面都可能影响线程安全:
- 变量可共享
- 变量可修改
- 访问修改变量是否使用同步机制
竞态条件
当代码的正确性需要取决于多线程的执行时序的时候,就会发生竞态条件,此时结果是不确定的。
通常是先检查再修改的情况,如 i++、或者对象延迟初始化(先判断对象为null,然后创建对象)。
合理使用synchronized
我们可以用synchronized限制临界区代码被多线程同时访问,但是同时也会有一些问题:
- 线程安全类的不安全使用:如先检查vector集合内是否有某个元素,没有进行添加,虽然vector是线程安全类,但是方法组合同样会发生竞态条件
- 性能问题:锁的粒度太大,直接对整个方法加锁;或者在一些耗时较长的地方加锁(如I/O等)
本博客所有文章除特别声明外,均采用 CC BY-NC-SA 4.0 许可协议。转载请注明来自 白兰!