静态变量为线程保留单个值,但volatile为所有线程保留单个值(example here)
大多数场景常量都声明为静态,并且常量数据对于所有线程都是相同的,所以为什么常量不会被声明为volatile
我们可以在java中使用volatile关键字
答案 0 :(得分:7)
我认为您误解了static
和volatile
。
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有一个很多更详细的信息。)