/**
 * @描述
 * @参数 $
 * @返回值 $
 * @创建人 [email protected]
 * @创建时间 $
 * @修改人和其它信息
 */
public class FadeShare implements Runnable{



    //数组长度
    public  static int arrayLength = 4;
    ///数组
    public static VolatileLong []longs = new VolatileLong[arrayLength];
    //计算次数
    public final static long count_time = 500L * 1000L * 1000L;
    //操作的角标   ---------------------!!!不能声明成静态因为那样代表一个对象,否则线程在用的时候每次都要去主存中加载多余数据在缓存,获取改值进行计算,占用巨大时间
    public final     int opIndex;
    //对数组的元素进行赋值:
    static{
        for (int i = 0; i < longs.length; i++) {
            longs[i] = new FadeShare.VolatileLong();
        }
    }
    public  FadeShare(int i){
        this.opIndex = i;
    }


    /**
     * 设计4个线程,执行同一个计算量 计算前后时间
     * @param args
     * @throws InterruptedException
     */
    public static  void main(String args []) throws InterruptedException {

        //java 准备清空缓存
        Thread.sleep(10000);
        final  long start = System.nanoTime();

        Thread  [] threads = new Thread[arrayLength];
        for(int i = 0 ;i< arrayLength; i++){
            threads[i] = new Thread(new FadeShare(i));
        }

        for (Thread thread : threads){
            thread.start();
        }
        for (Thread thread : threads){
            thread.join();
        }

        System.out.println( System.nanoTime() - start );


    }



    @Override
    public void run() {

        Long i = count_time;
        while ( 0 != --i ){
                longs[opIndex].value = i;

        }


    }

    //48Bit  注释掉后数组剩下 8个字节 以及对象头12 字节 会 加载 3个 到一个缓存行,其它线程执行时候会造成伪共享,只能到内存读取数据
    public final static  class VolatileLong{
        public volatile long value = 0l;
//        public long p1,p2,p3,p4;
//        public int p5;

    }



}

cpu缓存伪共享

 

 

相关文章:

  • 2021-10-28
  • 2021-06-21
  • 2021-10-15
  • 2021-05-20
  • 2022-01-10
  • 2021-10-11
  • 2021-12-12
  • 2021-11-15
猜你喜欢
  • 2021-08-18
  • 2021-05-06
  • 2022-12-23
  • 2021-08-31
  • 2022-12-23
  • 2021-08-18
  • 2021-08-28
相关资源
相似解决方案