2013-08-30 24 views
0

可以肯定地说ThreadLocal变量在概念上与Java中的volatile变量相反吗? 因为在前者中,每个线程只会读取/更新变量的本地副本。但是在后者中,每个线程总是会看到主内存中变量的最新值....没有机会看到陈旧的值。Threadlocal和volatile在概念上彼此相反

+3

我不这么认为。它们只是不同的概念。 – johnchen902

+1

“概念相反”对我来说似乎太过于极端的定义。但是你对TL和易失性行为的描述看起来很准确。 – pamphlet

+0

你的描述看起来很准确,但如果我不知道什么线程局部变量和变量是,我不明白你在说什么。我真的希望你不是在教人们:p – akostadinov

回答

0

究竟但有轻微的扭曲,

  • 一个ThreadLocal变量是针对每个线程
  • 任何其他变量只存在一次使用相同的对象中的每个线程,以便共同,无论是易失性的变量不同或不。

然而,易失性指定某种线程读/写边界,因此它们必须同步由任何其他线程写入的最新值。但是使用volatile不能确保线程安全。

E.g.递增易失性int的递增方法可能仍会生成重复项。为了确保工作线程安全,您必须同步更新volatile属性的方法!

检查此了解更多详细信息:https://www.cs.umd.edu/users/pugh/java/memoryModel/jsr-133-faq.html

+0

为什么volatile会确保线程安全?是不是挥发性的目的? – Victor

+0

@victor阅读:http://stackoverflow.com/questions/3603157/volatile-keyword-in-java-澄清 –

+0

@Victor易变保证可见性,但不是原子性。 – assylias