面试题思路

线程不安全的本质:

线程内存存副本

  • 更改副本不可见,互相覆盖(可见性)
  • 线程切换, 更改操作不具有原子性(原子性)
  • 有序性

类没有状态, 成员变量一定线程安全

成员变量只是可读也一定是线程安全的

修改成员变量时加互斥锁也一定是线程安全的

String为什么线程安全

final 只读 光这一点不够, 还因为是private 无法更改数组某一元素

因为字符串是不可变的,所以在它创建的时候HashCode就被缓存了,不需要重新计算。这就使得字符串很适合作为Map中的键,字符串的处理速度要快过其它的键对象。这就是HashMap中的键往往都使用字符串。