概念
线程安全:多线程访问时,采用加锁机制,一个线程访问一个数据时,进行保护,其他线程不得进行访问该数据 直到该线程读取完成.不会出现数据不一致或数据污染. 通俗来说: 多线程环境下运行的程序结果符合我们的预期要求,即 在单线程下的结果.那么这个程序就是线程安全的.
线程不安全:不提供数据保护,多个线程先后对数据进行更改会出现脏数据.
影响线程不安全的原因
(1)原子性
操作不可分割性,比如:a++操作是分为3步的①读取a的值②a的值+1③将更新后的值赋予a. 如果**一个线程正在执行时,中途插入了其他线程,**那么结果就可能是错误的.这就是不具备原子性了,会导致线程不安全. 所以为了保证原子性,需要进行加锁操作.
(2)可见性
线程在对共享变量进行操作时,会把数据从主内存拷贝到各自的工作内存中,当操作完成后再写入主内存中,因此 仅在工作内存的修改是不会影响到主内存中的值, 所以 已修改的共享变量在对于其他线程来说是不可见的, 这样其他线程拷贝的就是 旧值,这就是不可见带来的线程不安全.
(3)代码顺序性
顺序性:代码的顺序和执行顺序是一致的.
而出现不一致是因为:重排序;
重排序:就是编译器或运行环境为了优化程序性能而对代码进行重新排序.
在多线程里 重排序会导致语义发生改变,那么运行结果也会出现问题.