线程不安全原因(原子性,可见性,代码顺序性)

概念
线程安全:多线程访问时,采用加锁机制,一个线程访问一个数据时,进行保护,其他线程不得进行访问该数据 直到该线程读取完成.不会出现数据不一致或数据污染. 通俗来说: 多线程环境下运行的程序结果符合我们的预期要求,即 在单线程下的结果.那么这个程序就是线程安全的.
线程不安全:不提供数据保护,多个线程先后对数据进行更改会出现脏数据.

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

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值