线程不安全的原因及其解决

一、什么是线程不安全和线程安全

  • 定义:线程不安全:多线程并发执行某个代码时,产生了逻辑上的错误,结果和预期值不相同
  • 线程安全是指多线程执行时没有产生逻辑错误,结果和预期值相同

二、线程不安全产生的原因

  1. 线程是抢占执行的。
  2. 有的操作不是原子的。当 cpu 执行一个线程过程时,调度器可能调走CPU,去执行另一个线程,此线程的操作可能还没有结束;(通过锁来解决)
  3. 多个线程尝试修改同一个变量(一对一修改、多对一读取、多对不同变量修改,是安全的)
  4. 内存可变性
  5. 指令重排序:java的编译器在编译代码时,会针对指令进行优化,调整指令的先后顺序,保证原有逻辑不变的情况下,来提高程序的运行效率。

三、怎样解决线程不安全

  • 加锁

锁的特点:互斥的,同一时刻只有一个线程可以 获取到锁,其他线程如果尝试获取锁,就会发生阻塞等待,等到刚那个线程 释放锁 ,此时剩下的线程再重新竞争锁

基本操作:加锁,解锁(释放锁)

  • 使用锁 —— 关键字 synchronized
  1. 加到普通方法前:表示锁 this;
  2. 加到静态方法前:表示锁当前类的类对象(类对象就是 JVM运行时,将 .class 文件加载到内存中获取到的(类加载));对象名 . getClass() --》 获取类对象
  3. 加到某个代码之前,显示指定给某个对象加锁;
    如果两个对象有两把锁,各自锁各自的,就不会涉及冲突 / 互斥

但是,一旦锁里边的内容出现问题,就可能出现死锁,其他程序就只能一直等待,此时就得重启

四、相关代码

import java.
  • 3
    点赞
  • 24
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值