加入收藏 | 设为首页 | 会员中心 | 我要投稿 李大同 (https://www.lidatong.com.cn/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 编程开发 > Java > 正文

由于同步顺序,以下Java程序是否必须打印“num:1 m_i:2”

发布时间:2020-12-15 02:26:50 所属栏目:Java 来源:网络整理
导读:我只是想检查一下我对JMM的线程启动同步规则的理解是否正确: 由于以下同步顺序,以下Java程序是否必须打
我只是想检查一下我对JMM的线程启动同步规则的理解是否正确:

由于以下同步顺序,以下Java程序是否必须打印“num:1 m_i:2”.

http://java.sun.com/docs/books/jls/third_edition/html/memory.html#17.4.4

????启动线程的操作与其启动的线程中的第一个操作同步.

public class ThreadHappenBefore {
    static int num;
    int m_i;

    public static void main(String[] args) {
        final ThreadHappenBefore hb = new ThreadHappenBefore();
        num = 1;
            hb.m_i = 2;

        new Thread(new Runnable() {
            @Override
            public void run() {
                System.out.println("num:"+num);
                System.out.println("m_i:"+hb.m_i);
            }
        }).start();
    }
}

解决方法

在早期代码对后面的代码产生影响时,在其他代码之前编码的任何内容都保证在给定线程中的其他代码之前发生.因为线程开始是在赋值之后编码的,并且赋值会影响print语句的结果,所以这些赋值是打印它们的代码“可见”(即之前发生).

但是,从另一个线程查看时,对执行顺序的影响没有这样的保证.

已编辑(感谢评论者)

添加了关于重新排序的上述细化(粗体).

(编辑:李大同)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    推荐文章
      热点阅读