线程安全:就是在多线程并发执行某个代码的时候,没有产生逻辑上的错误
线程不安全:就是在多线程并发执行某个代码时,产生了逻辑上的错误。
线程不安全的原因
- 线程是抢占式执行的,线程之间的调度完全是由内核负责的,用户代码感知不到,也无法控制,线程之间谁先执行,谁后执行,谁执行到哪里从cpu上下来,这样的过程我们是无法感知到的
- 线程的操作不是原子的,每次的操作会分为三个操作(把内存的数据读取到cpu中,在cpu中操作数据,把计算结束的数据写回到内存中),当cpu执行到上面三个操作中的任何一步的时候
,都可能会被调度器调度走,让其他线程来执行。(导致的结果就是我们的一个操作做不完整,而导致最后得到的结果与逻辑不符合) - 多线程尝试修改一个变量(如果是一个线程修个一个变量,线程安全;如果多个线程尝试读取同一个变量,线程安全;如果多个线程尝试修改不同的变量,线程安全;如果有多个线程,一个线程读数据,一个线程修改数据,此时也是可能导致线程不安全;)
- 内存可见性导致的线程不安全
- 指令重排序(编译器在编译代码时,会针对指令进行优化,调整指令的先后顺序,保证原有逻辑不变的情况下,提高程序的运行效率)
如果解决线程不安全问题
- 抢占式执行是无法解决的,这是操作系统的内核实现的
- 操作的原子性(上锁可以保证操作的原子性)
- 多个线程同时修改同一个变量
锁synchronized
- 加到普通方法的前面:表示锁this
- 加到静态方法前:表示锁当前的类的类对象
- 加到某个代码块之前,显式指定某个对象加锁

被折叠的 条评论
为什么被折叠?



