一段代码搞懂volatile

导读:注意每一行注释

package example.volatileDemo;

/**

* @Description:

* @Date:

*/

public class VolatileVisibility {

public static class TestData {

//        volatile int num = 0;//注意:这里不加volatile的话,num值不会被提交到工作内存,while将死循环

        int num =0;

        public void updateNum(){

            num =1;

        }

}

public static void main(String[] args) {

final TestData testData =new TestData();

        new Thread(new Runnable() {

        @Override

            public void run() {

            System.out.println("ChildThread num-->"+testData.num);

                try {

                    Thread.sleep(1000);

                }catch (InterruptedException e) {

                }

                testData.updateNum();

                System.out.println("ChildThread update num-->"+testData.num);

            }

        }).start();

        //while 循环里面不能有synchronize、sleep等操作,否则会重新读取主存到工作内存

        //println内部对当前输出内容做锁操作synchronize

        while (testData.num ==0){

//            System.out.println("in while loop:testData.num == 0");

//            try {

//                Thread.sleep(300);

//            } catch (InterruptedException e) {

//                e.printStackTrace();

//            }

//            int i = 1;

        }

        System.out.println("MainThread num-->" + testData.num);

    }

}

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
【社区内容提示】社区部分内容疑似由AI辅助生成,浏览时请结合常识与多方信息审慎甄别。
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

友情链接更多精彩内容