资讯专栏INFORMATION COLUMN

java并发编程学习之Volatile

thekingisalwaysluc / 2381人阅读

摘要:但是的语义不足以确保递增操作的原子性,在多线程的情况下,线程不一定是安全的。检查某个状态标记,以判断是否退出循环某个方法这边和用普通的变量的区别是,在多线程的情况下,取到后,的值被改变了,判断会不正确。

多线程为什么是不安全的

这边简单的讲述一下,参考java并发编程学习之synchronize(一)

当线程A和线程B同时进入num = num + value;

线程A会把num的值拿出来,放在自己的工作区间里

线程B也把num的值拿出来,放在自己的工作区间里

线程A计算完,把值回填到num

这个时候,线程B的值还是原来的,计算完后,把值回填到num,就直接覆盖了线程A的值

Volatile知识

volatile变量,是稍弱的同步机制,不会被缓存到寄存器或者其他处理器不可见的地方,因此读取时,总会返回当前的最新值。这个性质,就是可变性,是Volatile的关键作用之一。但是Volatile的语义不足以确保递增操作的原子性,在多线程的情况下,线程不一定是安全的。

常用场景:

单例模式(懒汉模式)


我们模拟两个线程A,B,在还没创建单例对象的时候,一起进入getInstance方法。

A进入16行,此时singleton为空,时间片结束。

B也进入16行,获取到的singleton也是空,时间片结束。

A进入17行,这边是类锁,,B在等待A执行完这个代码块。

A执行完,生成singleton对象。

B继续执行,这边注意一下,因为是Volatile具有可见性的特性,此时,他是知道singleton不为空,已经被实例化了,于是就不继续实例化。如果B不是Volatile变量,那么,他就又实例化singleton,就破坏了单例的结构。

检查某个状态标记,以判断是否退出循环

Volatile boolean done;
....
某个方法{
    while(done){
       doSomeThing1();
    }
    doSomeThing2();
}

这边和用普通的变量的区别是,在多线程的情况下,取到done后,done的值被改变了,while判断会不正确。

使用的条件

对变量的写入操作,不依赖变量的当前值,或者确保单线程更新变量的值

该变量不会和其他变量一起纳入不变形条件中

访问变量时,不需要加锁

文章版权归作者所有,未经允许请勿转载,若此文章存在违规行为,您可以联系管理员删除。

转载请注明本文地址:https://www.ucloud.cn/yun/75160.html

相关文章

  • java并发编程习之AQS

    摘要:原理全称,当线程去获取资源的时候,会根据状态值来判断是否有锁,如果有锁,则加入到链表,链表里的线程,通过自旋,判断资源是否已经释放,如果释放,则获取资源。 原理 全称AbstractQueuedSynchronizer,当线程去获取资源的时候,会根据状态值state来判断是否有锁,如果有锁,则加入到链表,链表里的线程,通过自旋,判断资源是否已经释放,如果释放,则获取资源。 AQS结构 ...

    Tikitoo 评论0 收藏0
  • java并发编程习之cas(一)

    摘要:线程把的值放在中。线程执行,得到的为。,,独占锁,会导致其他所有需要锁的线程挂起,等待持有锁的线程释放锁。可见性,不保证原子性。乐观锁,不适用锁的情况下实现多线程的变量同步。性能问题在并发量较高的情况下,如果一直不成功,会一直增加的开销。 cas原理 cas全称Compare and swap,比较和交换的意思。原子操作,需要硬件的支持。三个基本操作数:内存地址V,旧的预期值A,要修改...

    ConardLi 评论0 收藏0
  • java并发编程习之synchronize(一)

    摘要:线程安全问题在并发编程学习之基础概念提到,多线程的劣势之一,有个线程安全问题,现在看看下面的例子。那么,该怎么解决呢,很简单,在方法前加个同步锁。运行结果如下有两种情况,是因为看谁先抢占锁,但是输出的算法结果是正确的。 线程安全问题 在java并发编程学习之基础概念提到,多线程的劣势之一,有个线程安全问题,现在看看下面的例子。 public class NotSafeDemo { ...

    Elle 评论0 收藏0
  • java并发编程习之再谈公平锁和非公平锁

    摘要:在并发编程学习之显示锁里有提过公平锁和非公平锁,我们知道他的使用方式,以及非公平锁的性能较高,在源码分析的基础上,我们看看和的区别在什么地方。而非公平锁直接尝试获取锁。 在java并发编程学习之显示锁Lock里有提过公平锁和非公平锁,我们知道他的使用方式,以及非公平锁的性能较高,在AQS源码分析的基础上,我们看看NonfairSync和FairSync的区别在什么地方。 lock方法 ...

    warkiz 评论0 收藏0
  • java并发编程习之FutureTask

    摘要:在并发编程学习之三种线程启动方式中有提过。是否执行结束,包括正常执行结束或异常结束。获取返回值,没有得到返回值前一直阻塞。运行结果如下由于任务被取消,所以抛出异常。注意的是,此时线程还在跑,和返回的是。并不能让任务真正的结束。 FutureTask 在java并发编程学习之三种线程启动方式中有提过。主要的方法如下: cancel(boolean mayInterruptIfRunni...

    BothEyes1993 评论0 收藏0

发表评论

0条评论

thekingisalwaysluc

|高级讲师

TA的文章

阅读更多
最新活动
阅读需要支付1元查看
<