解决线程不安全问题的三种方法

本文介绍了Java中解决线程不安全问题的三种方法:volatile关键字、synchronized和Lock。volatile防止指令重排序和确保可见性,但无法解决原子性问题。synchronized提供互斥锁,确保关键代码段的同步执行,而Lock是手动锁,更灵活,可设置公平性。两者在使用场景、锁策略和灵活性上有所不同。
摘要由CSDN通过智能技术生成

解决线程不安全问题的三种方法
一.volatile:轻量级解决“线程安全”的方案
1.作用:

  1. 禁止指令重排序
  2. 解决线程可见性的问题,实现原理是当操作完变量之后,强制删除掉线程工作内存中的此变量。
    注意事项:
    volatile不能解决原子性问题。
    二. 线程的工作方式:
    (1.)先在自己的工作内存中找变量
    (2.)去主内存里面找变量.
    三.线程安全问题解决
    1.CPU抢占式调度(不能解决,因为CPU抢占是不可控的)
    2.每个线程操作自己的变量(可能行)不通用,修改难度大。
    3.在关键代码让所有的CPU排队执行,加锁。
    (1)锁操作的关键步骤:
  3. 尝试获取( 如果成功拿到锁加锁,排队等待)
  4. 释放锁
    四.Java中解决线程安全问题的方案:
  1. synchronized 加锁和释放锁 [ JVM 层面的解决方案,自动帮我们进行加锁和释放锁 ]
  2. Lock手动锁[程序员自己加锁和释放锁]
    五 .synchronized注意事项:
    在进行加锁操作的时候,同一组业务一定是同一个锁对象。
    1.synchronized实现原理:
    (1.)操作:互斥锁mutex
    (2.)JVM中:帮我们实现的监视器锁的加锁和释放锁的操作。
    (3.)在Java层面中:
    a)锁对象mutex .
    b)锁存放的地方:变量的对象头
    2.synchronized说明
    synchronized锁机制是非公平锁。
    公平锁可以按顺序进行
  • 2
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值