public class VolatileOne { private static boolean ready ; private static int number ; private static class ReaderThread extends Thread{ @Override public void run() { while (!ready){ Thread.yield(); } System.out.print(number); } } public static void main(String[] args) { new ReaderThread().run(); ready = true; number = 50; }}运行这段代码后,程序并没有停止,这很明显,因为线程将准备好的变量备份到自己进程的内存中。当我使用 volatile 关键字修改 readprivate volatile static boolean ready ;此时读取的变量不会被复制到进程内存中。但程序不能停止。什么原因?它与静态关键字有关吗?如果你想让程序输出50并返回,你应该怎么做?
1 回答
德玛西亚99
TA贡献1770条经验 获得超3个赞
您需要调用
start
才能在另一个线程中执行代码。检查这个run
和之间的区别start
。打电话
join
等待ReaderThread
完成。volatile
关键字可以在写线程和读线程之间建立起一个happens-before关系,你可以放number = 50;
beforeready = true;
,这样可以保证读者会注意到number
是50
什么时候注意到ready
的true
。
例子:
Thread reader = new ReaderThread();
reader.start();
number = 50;
ready = true;
reader.join();
添加回答
举报
0/150
提交
取消