java指令重排序代码演示

Wesley13
• 阅读 604

Jdk版本:jdk1.8.0_151

代码

public class SimpleHappenBefore {

    public static void main(String[] args) throws InterruptedException {

        for(int i=0;i<500000;i++){
            SimpleHappenBefore.State state = new SimpleHappenBefore.State();
            ThreadA threadA=new ThreadA(state);
            ThreadB threadB=new ThreadB(state);
            threadA.start();
            threadB.start();

            threadA.join();
            threadB.join();
        }
    }

    static class ThreadA extends Thread{

        private final SimpleHappenBefore.State state;

        ThreadA(SimpleHappenBefore.State state) {
            this.state = state;
        }

        public void run(){
            state.a=1;
            state.b=1;
            state.c=1;
            state.d=1;
        }
    }

    static class ThreadB extends Thread{

        private final SimpleHappenBefore.State state;

        ThreadB(SimpleHappenBefore.State state) {
            this.state = state;
        }

        public void run(){
            if(state.b==1 && state.a==0){
                System.out.println("b=1");
            }

            if(state.c==1 && (state.b==0 || state.a == 0)){
                System.out.println("c=1");
            }

            if(state.d==1 && (state.a==0 || state.b==0 || state.c==0)){
                System.out.println("d==1");
            }
        }
    }

    static class State {
        public int a = 0;
        public int b = 0;
        public int c = 0;
        public int d = 0;
    }
}

输出

d==1
d==1
c=1
点赞
收藏
评论区
推荐文章
待兔 待兔
4个月前
手写Java HashMap源码
HashMap的使用教程HashMap的使用教程HashMap的使用教程HashMap的使用教程HashMap的使用教程22
Wesley13 Wesley13
3年前
java中使用redis
1.java代码publicclassRedisTest01{publicstaticvoidmain(Stringargs){//connectredisserverJedisredisnewJedis("127.0.0
Wesley13 Wesley13
3年前
java 线程方法join的简单总结
一、作用  Thread类中的join方法的主要作用就是同步,它可以使得线程之间的并行执行变为串行执行。具体看代码:publicclassJoinTest{publicstaticvoidmain(Stringargs)throwsInterruptedException{
先知 先知
3年前
java实现九九乘法表的输出
这是小学二年级令人难忘的坷如今以java程序的行式展示,真不戳!publicclassscore{publicstaticvoidmain(Stringargs){inti,j;for(i1;i<9;i){for(j1;j<9;j
Wesley13 Wesley13
3年前
Java16周作业
题目1:编写一个应用程序,利用Java多线程机制,实现时间的同步输出显示。/\使用Runnable接口使用类创建线程对象,重写run()方法\\/代码publicclasstimetext{publicstaticvoidmain(Stringargs){Threa
Stella981 Stella981
3年前
JVM调优YoungGC
先上代码:主函数:1.publicclassGCDemo{3.publicstaticvoidmain(String\\args)throwsInterruptedException{6.List<GCDataObjectlistnewArrayList<GCDat
Stella981 Stella981
3年前
CentOS6.7 i686上安装JDK7
内核版本:root@heima01javaunameaLinuxheima012.6.32573.el6.i6861SMPThuJul2312:37:35UTC2015i686i686i386GNU/Linux发行版本:root@heima01java
Wesley13 Wesley13
3年前
Java中i++和++i的区别
publicstaticvoidmain(Stringargs){inti0;for(intj0;j<100;j){ii;}System.out.println(i);}输出结果是0,
Easter79 Easter79
3年前
ThreadLocal理解
1.使用ThreadLocal的时候我们保证了每个线程可以隔离使用对象,避免线程间的数据干扰。常用例子:publicclassThreadLocalTest{publicstaticvoidmain(Stringargs)throwsInterruptedException{
Wesley13 Wesley13
3年前
JdiDemo
HelloWorld.javapackagecom.my.jdi;publicclassHelloWorld{publicstaticvoidmain(Stringargs)throwsException{inti0;while(true){