volatile和static关键字有什么区别?

时间:2014-03-17 06:44:56

标签: java multithreading

静态变量为线程保留单个值,但volatile为所有线程保留单个值(example here

大多数场景常量都声明为静态,并且常量数据对于所有线程都是相同的,所以为什么常量不会被声明为volatile

我们可以在java中使用volatile关键字

1 个答案:

答案 0 :(得分:7)

我认为您误解了staticvolatile

static只是在整个类型中有一个字段。它与线程无关 - 它只是关于类型(static)的一个字段或类型的每个实例的一个字段(非static

volatile只是关于一个线程所做的更改在其他线程中可见的保证。这与字段是否为静态无关。来自section 8.3.1.4 of the JLS

  

Java编程语言允许线程访问共享变量(第17.1节)。通常,为了确保共享变量的一致性和可靠性更新,线程应确保通过获取锁定来独占使用此类变量,通常会对这些共享变量实施互斥。

     

Java编程语言提供了第二种机制volatile字段,比某些用途的锁定更方便。

     

字段可以声明为volatile,在这种情况下,Java Memory Model可以确保所有线程都看到变量的一致值(第17.4节)。

Section 17.4有一个很多更详细的信息。)