Java中volatile关键字的最简单易懂的例子
我正在阅读
Java中的volatile关键字并完全理解它的理论部分.
但是,我正在寻找的是一个很好的案例,它展示了如果变量不是易变的话会发生什么. 下面的代码段不能按预期工作(取自here): class Test extends Thread { boolean keepRunning = true; public void run() { while (keepRunning) { } System.out.println("Thread terminated."); } public static void main(String[] args) throws InterruptedException { Test t = new Test(); t.start(); Thread.sleep(1000); t.keepRunning = false; System.out.println("keepRunning set to false."); } } 理想情况下,如果keepRunning不是volatile,则线程应该无限期地继续运行.但是,它会在几秒钟后停止. 我有两个基本问题: >任何人都可以用例子解释volatile吗?不是来自JLS的理论. 解决方法
挥发性 – >保证可见性而非原子性
同步(锁定) – >保证可见性和原子性(如果正确完成) 易失性不能代替同步 仅在更新引用且不对其执行某些其他操作时使用volatile. 例: volatile int i = 0; public void incrementI(){ i++; } 不使用同步或AtomicInteger将不是线程安全的,因为递增是复合操作.
那取决于各种情况.在大多数情况下,JVM足够智能来刷新内容. Correct use of volatile讨论了挥发性物质的各种可能用途.正确使用volatile非常棘手,我会说“如果有疑问,请将其保留”,请使用synchronized块. 也: 可以使用synchronized块代替volatile,但反之则不然. (编辑:李大同) 【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容! |