如何解决线程安全问题
【Q】什么是线程安全?
当多个线程访问某个类时,这个类始终能表现出正确的行为,我们称这个类是线程安全的。
线程安全问题无非是资源竞争导致的。
【Q】如何做到线程安全?
- 阻塞同步:使用锁。
- 非阻塞同步:是一种乐观策略,先进行操作,如果没有其他线程争用共享数据,那操作就成功了,如果有争用,就采取补救措施(最常见的是不断重试,直到成功为止),这种策略无需上下文切换,且整个过程具备原子性,典型的就是《CAS》
- 栈封闭:即不使用共享变量,改为使用局部变量。
- 使用 《ThreadLocal》:为每个线程都创建一个独立变量,做到了线程隔离。
同步是时间换空间,使用局部变量以及 ThreadLocal 线程隔离是空间换时间。