1
104
当您想让一个成员变量被多个线程访问,但不需要复合原子性(不确定这是否是正确的术语)时,基本上可以使用它。
以上就是一个坏例子,因为你 需要 复合原子性。
下面是一个有效的例子:
现在,你为什么不能只用
基本上这意味着你的应用程序甚至有可能。保持写作
如果你放
编辑:
你可以,它会正常运转。任何你能用的东西
|
2
14
volatile在无锁算法中最有用。如果不使用锁定访问该变量,并且希望一个线程所做的更改在另一个线程中可见,或者希望创建“之后发生”关系以确保不重新排序计算,则将保存共享数据的变量标记为可变变量,以确保更改在适当的时间可见。 这个 JMM Cookbook 描述哪些操作可以重新排序,哪些操作不能。 |
3
6
从Java并发 tutorial :
这意味着对可变变量的更改对于其他线程总是可见的。它还意味着,当线程读取可变变量时,不仅可以看到可变变量的最新变化,还可以看到导致变化的代码的副作用。 关于您的查询:
如果您觉得所有的读线程总是获得一个变量的最新值,那么您必须将该变量标记为
如果有一个编写器线程要修改变量的值,而有多个编写器线程要读取变量的值 ,volatile修饰符保证内存一致性。
如果您有多个线程来写入和读取变量,
相关SE问题/文章: Volatile variable explanation in Java docs |
4
5
这个
像这样声明一个字段
见 Java Concurrency in Practice 关于那个主题的更多信息。 |
5
3
事实上,我不同意上面投票的答案中给出的例子,据我所知,的确如此。 不是 根据Java内存模型适当地说明易失性语义。volatile的语义更加复杂。 在所提供的示例中,主线程可以永远继续打印“今天的温度是0”,即使有另一个线程正在运行,如果另一个线程从未被调度过,那么它应该更新温度。 用2个变量来说明易失性语义是一种更好的方法。 为了简单起见,我们假设更新这两个变量的唯一方法是通过方法 “设置温度” . 为了简单起见,我们假设只有2个线程在运行,即主线程和线程2。
最后两个作业指令可以 不是 为了优化的目的,可以由编译器、运行时或硬件重新排序。
一旦主线程读取挥发性可变温度(在打印过程中)。 1)有保证它将看到 最近写的 这个易失变量的值,不管有多少线程正在写入它,不管它们在哪个方法中更新它,是否同步。 2)如果主线程中的system.out语句运行, 之后 线程2运行语句temperature=temp时的时间,昨天的温度和今天的温度都将保证打印线程2在运行语句temperature=temp时设置的值。 这种情况下 批次 如果a)多个线程正在运行,b)还有其他方法,而不仅仅是setttemperatures方法,可以更新变量昨天的温度和今天的温度,这些其他线程正在主动调用这些变量。我认为,根据Java内存模型如何描述易失性语义,将需要一个体面的文章来分析其含义。 简而言之,尝试只使用volatile进行同步是非常危险的,最好还是坚持同步方法。 |
6
2
http://mindprod.com/jgloss/volatile.html “volatile关键字用于其他线程可能同时修改的变量。” “由于其他线程看不到局部变量,因此不需要将局部变量标记为volatile。您需要同步以协调来自不同线程的变量更改,但通常volatile只需查看它们就可以了。” |
7
1
ValTale:意味着不断改变值。这个变量的值永远不会在本地缓存线程:所有的读写都直接进入“主内存”。换句话说,Java编译器和线程不缓存这个变量的值,并且总是从主内存读取它。 |
Ma Joonyoung · 粗粒度和细粒度链表的时间比较 1 年前 |
user1700890 · 了解交互式代理Python API中的线程 2 年前 |
AntonBoarf · 为什么要将实例变量指定给局部变量? 2 年前 |
rhymes · 如何让线程操作相同的java列表 2 年前 |