问答文章1 问答文章501 问答文章1001 问答文章1501 问答文章2001 问答文章2501 问答文章3001 问答文章3501 问答文章4001 问答文章4501 问答文章5001 问答文章5501 问答文章6001 问答文章6501 问答文章7001 问答文章7501 问答文章8001 问答文章8501 问答文章9001 问答文章9501

加不加Volatile看不出有什么效果啊求解

发布网友 发布时间:2022-04-28 20:59

我来回答

1个回答

热心网友 时间:2022-06-23 04:31

想看出效果来比较困难!
一个boolean 本省就是原子操作。
如果你换一个真正的Object,n个线程操作,你就会发现有效果了。
参见:以下为引用IBM网站上
Java64 语言包含两种内在的同步机制:同步块(或方法)和 volatile 变量。这两种机制的提出都是为了实现代码线程的安全性。其中 Volatile 变量的同步性较差(但有时它更简单并且开销更低),而且其使用也更容易出错。在这期的 Java 理论与实践 中,Brian Goetz 将介绍几种正确使用 volatile 变量的模式,并针对其适用性*提出一些建议。
Java 语言中的 volatile 变量可以被看作是一种 “程度较轻的 synchronized”;与 synchronized 块相比,volatile 变量所需的编码较少,并且运行时开销也较少,但是它所能实现的功能也仅是 synchronized 的一部分。本文介绍了几种有效使用 volatile 变量的模式,并强调了几种不适合使用 volatile 变量的情形。
锁提供了两种主要特性:互斥(mutual exclusion) 和可见性(visibility)。互斥即一次只允许一个线程持有某个特定的锁,因此可使用该特性实现对共享数据的协调访问协议,这样,一次就只有一个线程能够使用该共享数据。可见性要更加复杂一些,它必须确保释放锁之前对共享数据做出的更改对于随后获得该锁的另一个线程是可见的 —— 如果没有同步机制提供的这种可见性保证,线程看到的共享变量可能是修改前的值或不一致的值,这将引发许多严重问题。
Volatile 变量
Volatile 变量具有 synchronized 的可见性特性,但是不具备原子特性。这就是说线程能够自动发现 volatile 变量的最新值。Volatile 变量可用于提供线程安全,但是只能应用于非常有限的一组用例:多个变量之间或者某个变量的当前值与修改后值之间没有约束。因此,单独使用 volatile 还不足以实现计数器、互斥锁或任何具有与多个变量相关的不变式(Invariants)的类(例如 “start <=end”)。
出于简易性或可伸缩性的考虑,您可能倾向于使用 volatile 变量而不是锁。当使用 volatile 变量而非锁时,某些习惯用法(idiom)更加易于编码和阅读。此外,volatile 变量不会像锁那样造成线程阻塞,因此也很少造成可伸缩性问题。在某些情况下,如果读操作远远大于写操作,volatile 变量还可以提供优于锁的性能优势。
正确使用 volatile 变量的条件
您只能在有限的一些情形下使用 volatile 变量替代锁。要使 volatile 变量提供理想的线程安全,必须同时满足下面两个条件:
对变量的写操作不依赖于当前值。
该变量没有包含在具有其他变量的不变式中。
实际上,这些条件表明,可以被写入 volatile 变量的这些有效值独立于任何程序的状态,包括变量的当前状态。
第一个条件的*使 volatile 变量不能用作线程安全计数器。虽然增量操作(x++)看上去类似一个单独操作,实际上它是一个由读取-修改-写入操作序列组成的组合操作,必须以原子方式执行,而 volatile 不能提供必须的原子特性。实现正确的操作需要使 x 的值在操作期间保持不变,而 volatile 变量无法实现这点。(然而,如果将值调整为只从单个线程写入,那么可以忽略第一个条件。)
大多数编程情形都会与这两个条件的其中之一冲突,使得 volatile 变量不能像 synchronized 那样普遍适用于实现线程安全。清单 1 显示了一个非线程安全的数值范围类。它包含了一个不变式 —— 下界总是小于或等于上界。
声明声明:本网页内容为用户发布,旨在传播知识,不代表本网认同其观点,若有侵权等问题请及时与本网联系,我们将在第一时间删除处理。E-MAIL:11247931@qq.com
谷歌浏览器怎么设置成中文_谷歌浏览器设置中文语言 【谷歌浏览器技巧】谷歌浏览器如何更改语言? 史上最全ETF全解 证券ETF是深市的吗 怎样把莲藕肉丸子做的好吃? 高三语文小说赏析小说形象分析与答题技巧 人物形象题答题技巧 借助什么分析小说的人物形象 脖子旁边疼是什么原因 在群里不是好友怎么把群里人建另一个群 煮方便面先放鸡蛋还是先放面? 煮挂面的时候鸡蛋什么时候放合适呢? 鸡蛋煮挂面的做法 先放鸡蛋还是先放面 做面条先面条还是先鸡蛋? coineal用户已锁定是什么意思? 鸡蛋面是先放鸡蛋呢还是先放面啊? “账号已被锁定”是什么意思 下面条是先放鸡蛋还是先放面条? 用户已被锁定是什么意思? 有做钵钵鸡的调料吗 钵钵鸡的那个红油蘸料,怎么制作啊,配方怎么做才香呢?之前吃过一家,味道特别好?就想试一试 钵钵鸡调料包怎么使用? 谁知道钵钵鸡的调料怎么做啊?尽量多说几种,谢谢了! 钵钵鸡调料怎么调 钵钵鸡的调味料是哪些? 梦见和和前妻在一起都贫穷没钱 梦见和离婚多年的前妻一起组建家庭! 做梦和前妻。在一起,但是没有关系是怎么回事? 梦见和前妻一起割水稻 如何使用 volatile,synchronized,final 进行线程间通信 为什么volatile不能保证原子性而Atomic可以 voliate怎么保证可见性 ANSI C语言标准 很多孕妇都要进行唐筛,这个检查的作用是什么? 有些孕妇不了解唐氏筛查,什么是唐氏筛查? 智慧医保怎么查询缴费记录 孕妇在什么时间段做唐氏筛查? 孕妈妈做唐氏筛查,孕几周的时候去做比较合适? 江苏智慧人社怎么查不到医疗保险缴费记录 孕妇都需要做唐筛吗?做唐筛是为了什么呢? 孕妇唐氏筛查主要查胎儿甚么症状 孕期做唐氏筛查,什么时候做最好? 孕妇做唐氏筛查要空腹吗? 医生提示一个月后做唐氏筛查,唐氏筛查都查些什么啊? 孕妇在做唐氏筛查之前需要做好什么准备工作? 智慧人社医疗保险怎么查不到 孕妇的唐氏筛查步骤是怎麼的?? 河北智慧医保历史查询在哪里找 孕妇一定要做唐筛吗