【发布时间】:2015-09-06 12:25:59
【问题描述】:
我是 Java 新手,目前正在学习 volatile。假设我有以下代码:
public class Test
{
private static boolean b = false;
public static void main(String[] args) throws Exception
{
new Thread(new Runnable()
{
public void run()
{
while(true)
{
b = true;
}
}
}).start();
// Give time for thread to start
Thread.sleep(2000);
System.out.println(b);
}
}
输出:
是的
这段代码有两个线程(主线程和另一个线程)。为什么其他线程能够修改b 的值,b 不应该是volatile 才能发生这种情况?
【问题讨论】:
-
@fillpant 您给我的链接(据我所知),
volatile保证变量不会在本地缓存。所以在我的代码中因为我没有使用volatile,所以应该在本地缓存变量,但是这并没有发生,其他线程的修改被主线程看到了!! -
检查这个答案http://stackoverflow.com/questions/4934913/are-static-variables-shared-between-threads。它说,即使变量没有被标记为 volatile ,如果写操作发生在任何其他线程的读操作之前,更新的静态变量将对其他线程可见,这在你的代码中就是这种情况,因为你在主线程上调用 sleep 2 秒,这个时间绰绰有余。移除睡眠电话,您可能会看到零星的结果
标签: java