问题内容: 假设我在Spring单例bean (简化代码)中进行了一些初始化: 我应该担心其他豆的可见性并对其进行标记吗? (假设我无法在构造函数中初始化它) 第二种情况:如果我 覆盖 in的值(例如在显式初始化或构造函数中的初始化之后),那么 将不会首先写入 该属性怎么办? 问题答案: Spring框架与Java编程语言无关,它只是一个框架。因此,通常,您需要将不同线程访问的非final字段标记
问题内容: 这个问题已经在这里有了答案 : atomic / volatile / synchronized有什么区别? (7个答案) 11个月前关闭。 我知道允许可见性,允许原子性。因此,如果我使用volatile ,是否意味着我不必再使用任何同步机制了? 例如。 这是线程安全的吗? 问题答案: 我相信这实际上会 同时带来 原子性和波动性。因此,当您致电(say)时,可以保证获得 最新的 价值。
问题内容: 如果在一个类中我有一个ConcurrentHashMap实例,该实例将被多个线程修改并读取,则可以这样定义: 添加到myMap字段会导致错误,提示我只能使用final或volatile。为什么不能两者兼而有之? 问题答案: 仅与变量本身的修改有关,与变量所指的对象无关。有一个字段是没有意义的,因为不能修改最终字段。只需声明该字段,就可以了。
问题内容: 从java4和java5开始使用时有什么区别? 与此相关的是 当非原子变量(长/双)被声明为volatile时,它们的读/写操作是原子的。 这对于Java4 还是 正确的, 或者 从Java5开始有效???? 问题答案: 人们回答了我回答第一部分的问题时提供了好的观点和参考。 具体到问题的第二部分,我在某个论坛上阅读过: volatile声明的long是原子的(也是Java 5之前的版
问题内容: 我已经看了这个答案,它说明了如何: 在新的内存模型下,当线程A写入易失性变量V,而线程B从V读取时,现在保证了在写入V时A可见的任何变量值对B可见。 因此,给出示例: 尽管(仅)不易变性,但是否保证线程b看到(从-1到1)的更改? 如果是这样的话,给定一系列更改是为了使另一个线程可见,那么除了最后一个可变变量之外,是否要对其他任何变量进行更改有没有目的? 问题答案: 是的,保证对b 的
问题内容: 这似乎是一个非常基本的问题,但我找不到明确的确认。 假设我有一个本身已正确同步的类: 如果我需要 引用 在线程之间共享的该类的实例, 我仍然需要将该实例声明为volatile或final ,对吗?如: 或者,如果不能是最终的,则因为其实例化取决于其他一些事先未知的条件(与GUI的交互,来自套接字的信息等): final或volatile是强制性的 ,将访问权限同步到其自身成员的事实并不
问题内容: 这个问题仅涉及内存可见性,而不是发生在之前和之后。Java中有四种方法可以保证一个线程中的内存更改对另一线程可见。(参考http://gee.cs.oswego.edu/dl/cpj/jmm.html) 写入线程释放同步锁,而读取线程随后获取该相同的同步锁。 如果将一个字段声明为易失性字段,则在写入线程执行任何进一步的内存操作之前,写入该线程的任何值都会被写入线程并使写入线程可见(即,
问题内容: 我阅读了一些有关该关键字的文章,但无法弄清其正确用法。您能否告诉我在C#和Java中应该使用什么? 问题答案: 对于C#和Java,“ volatile”告诉编译器一个变量的值一定不能被缓存,因为它的值可能会在程序本身范围之外改变。然后,如果变量“超出其控制范围”更改,编译器将避免可能导致问题的任何优化。
问题内容: 根据: http://www.ibm.com/developerworks/library/j-jtp03304/ 在新的内存模型下,当线程A写入易失性变量V,并且线程B从V读取时,现在保证了在写入V时A可见的任何变量值对B可见。 互联网上的许多地方都指出,以下代码永远不应显示“错误”: 应 当为1,所有的线程是1。 但是 有时我会打印“错误” 。这怎么可能? 问题答案: 更新: 对于
问题内容: 考虑一个。我们知道JLS为我们提供以下保证: 写入线程的每个动作及其价值写入前述以程序顺序的写入动作; 的值写入通过 的成功读取从由读取线程; 成功读取从由读线程 的所有后续行动的程序顺序。 然而,仍有给出无挂钟时间的保证 ,当 读线程将观察值。简单地实现 从未 让读线程看到该值仍符合本合同。 我已经考虑了一段时间,看不到任何漏洞,但我认为一定是有漏洞的。请指出我的推理漏洞。 问题答案
问题内容: 由多个线程访问但仅在同步块内部访问的变量是否需要volatile修饰符?如果没有,为什么? 问题答案: 您不需要在内部使用,synced已经保证了一致地使用(每次访问)时变量的本地缓存的正确行为。 适用于原始值,并且可以作为原子访问原始类型的理想捷径。请注意,在JDK 5中,volatile的行为已从1.4开始更改。 更多信息可以在这里找到
问题内容: 今天的工作中,我遇到了volatileJava中的关键字。不太熟悉,我找到了这种解释。 鉴于该文章详细解释了所讨论的关键字,您是否曾经使用过它,或者是否曾见过可以正确使用此关键字的情况? 问题答案: volatile具有内存可见性的语义。基本上,volatile字段的值对所有读取器(尤其是其他线程)可见,在该字段上完成写操作之后。没有volatile,读者可能会看到一些未更新的值。 要
问题内容: 我最近在一次演讲中听说,对volatile的写操作会为线程已写入的每个变量触发内存屏障。真的对吗?从JLS看来,似乎只有相关的变量被清除了,而其他变量则没有。有人知道什么是正确的吗?能否给我指出JLS中的具体位置? 问题答案: 对挥发性变量和其他变量的引用是正确的。我没有意识到,before- before的可传递性是VM必须实现的,而不是从定义中得出的。我仍然感到困惑,为什么并没有明
问题内容: 我已经看过SO中的其他volatile与Atomicxxxx问题(包括此问题),并阅读了java.util.current.atomic的描述,但我对细微差别并不满意。 如果我要决定在和之间使用,除了AtomicBoolean提供的原子读取-修改-写入操作之外,还有其他实际区别吗?(例如和) 假设我有 然后,一个或多个线程设置该标志(但不清除它)。如果我有一个线程读取该标志,并且设置了
问题内容: Java线程安全性易变吗?也就是说,可以安全地读取和写入它而无需锁定吗? 问题答案: 是的,您可以从中读取并安全地对其进行写入-但您不能做任何复合操作,例如安全地对其进行递增,因为这是一个读/修改/写周期。还有一个问题是它如何与 其他 变量的访问交互。 坦率地说,volatile的确切性质令人困惑(有关更多详细信息,请参见JLS的内存模型部分)-我 个人 通常会使用它作为确保正确使用的