摘要:但是的语义不足以确保递增操作的原子性,在多线程的情况下,线程不一定是安全的。检查某个状态标记,以判断是否退出循环某个方法这边和用普通的变量的区别是,在多线程的情况下,取到后,的值被改变了,判断会不正确。
多线程为什么是不安全的
这边简单的讲述一下,参考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
摘要:原理全称,当线程去获取资源的时候,会根据状态值来判断是否有锁,如果有锁,则加入到链表,链表里的线程,通过自旋,判断资源是否已经释放,如果释放,则获取资源。 原理 全称AbstractQueuedSynchronizer,当线程去获取资源的时候,会根据状态值state来判断是否有锁,如果有锁,则加入到链表,链表里的线程,通过自旋,判断资源是否已经释放,如果释放,则获取资源。 AQS结构 ...
摘要:线程把的值放在中。线程执行,得到的为。,,独占锁,会导致其他所有需要锁的线程挂起,等待持有锁的线程释放锁。可见性,不保证原子性。乐观锁,不适用锁的情况下实现多线程的变量同步。性能问题在并发量较高的情况下,如果一直不成功,会一直增加的开销。 cas原理 cas全称Compare and swap,比较和交换的意思。原子操作,需要硬件的支持。三个基本操作数:内存地址V,旧的预期值A,要修改...
摘要:线程安全问题在并发编程学习之基础概念提到,多线程的劣势之一,有个线程安全问题,现在看看下面的例子。那么,该怎么解决呢,很简单,在方法前加个同步锁。运行结果如下有两种情况,是因为看谁先抢占锁,但是输出的算法结果是正确的。 线程安全问题 在java并发编程学习之基础概念提到,多线程的劣势之一,有个线程安全问题,现在看看下面的例子。 public class NotSafeDemo { ...
摘要:在并发编程学习之显示锁里有提过公平锁和非公平锁,我们知道他的使用方式,以及非公平锁的性能较高,在源码分析的基础上,我们看看和的区别在什么地方。而非公平锁直接尝试获取锁。 在java并发编程学习之显示锁Lock里有提过公平锁和非公平锁,我们知道他的使用方式,以及非公平锁的性能较高,在AQS源码分析的基础上,我们看看NonfairSync和FairSync的区别在什么地方。 lock方法 ...
摘要:在并发编程学习之三种线程启动方式中有提过。是否执行结束,包括正常执行结束或异常结束。获取返回值,没有得到返回值前一直阻塞。运行结果如下由于任务被取消,所以抛出异常。注意的是,此时线程还在跑,和返回的是。并不能让任务真正的结束。 FutureTask 在java并发编程学习之三种线程启动方式中有提过。主要的方法如下: cancel(boolean mayInterruptIfRunni...
阅读 2228·2019-08-30 10:51
阅读 784·2019-08-30 10:50
阅读 1462·2019-08-30 10:49
阅读 3129·2019-08-26 13:55
阅读 1590·2019-08-26 11:39
阅读 3412·2019-08-26 11:34
阅读 1936·2019-08-23 18:30
阅读 3380·2019-08-23 18:22