线程安全问题(收集和记录)

线程安全和线程不安全的集合
两个例子讲解为什么线程不安全以及带来的问题

如何线程安全

  • 加锁synchronized 根据情况判断锁class还是锁object, 有时候无脑锁class也不会带来性能消耗
  • 使用集合锁
public static List linkedList = Collections.synchronizedList(new LinkedList());
  • 使用已经处理好多线程同步问题的集合, 比如Vector

什么情况下不用焦虑线程安全

"写操作"有可能造成数据不一致问题引发异常
如果确定某个API的调用对后续操作没有影响

  • UI展示, 某一秒和下一秒展示的多少并没有多大关系,就算多线程同步加操作, UI上只展示那一刻的数据, 纯粹的是一个"读操作"
  • 其他"读操作", 且读取后的值不会对自身有影响
  • 对基本对象的写操作, 比如int string, 多个线程共同操作后如果不加锁会导致结果不确定, 但是也不会引起崩溃异常. 不在乎这个瞬时的结果也无所谓, 在UI编程中常常不在乎频繁更新展示的结果

多线程问题不处理容易造成的2个问题

  1. 多线程操作后的结果不确定, 比如10个线程, 反复i++, 100次, 结果不一定是加了100次. 但是也不会崩溃.
  2. 使用某些类, 某些类内部有多个变量保存这个类的状态, 而这些变量如果多个线程修改会带来不一致的情况, 比如数组越界, 自然就崩溃了

String类线程不安全? 辟谣!

长期的填鸭教育诞生的谣言, String和StringBuilder线程不安全, 但是StringBuffer线程安全
但是实际上String类内部就没有那么多状态, 不存在是否安全的问题, 说String安全与否和说int安全与否一个意思, 为了验证我的想法, 专门就这个基本的问题Google了一下, 提到了一个"immutability"概念, 不可变, 如果一个变量或者对象不可变, 就没有"状态冲突"一说. 这时候String虽然作为一个Object, 但是和基本数据类型int float long比较相似.
参考链接
is String thread safe?

你可能感兴趣的:(java)