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

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

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

解决线程不安全问题的三种方法
一.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锁机制是非公平锁。
    公平锁可以按顺序进行执行,而非公平锁执行的效率更高。
    在Java中所有锁默认的策略都是非公平锁。

(1) JDK 1.6之前是使用重量级锁实现的,性能非常低,所以用的并不多。
(2)JDK 1.6对synchronized做了一个优化(锁升级) :
优化过程:无锁—》偏向锁(第一个线程第一次访问)—》轻量级锁(自旋

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值