Java8使用@Contended避免伪共享

为了避免多线程更新的变量或对象处于同一缓存行而导致的伪共享问题,使用@Contended注解可大幅提升执行效率。

package com.chen.allen.learn;

import sun.misc.Contended;

public class ContendedTest {

//    @Contended
    volatile long a;
//    @Contended
    volatile long b;

    public static void main(String[] args) throws InterruptedException {
        ContendedTest c = new ContendedTest();
        Thread thread1 = new Thread(() -> {
            for (int i = 0; i < 10000_0000L; i++) {
                c.a = i;
            }
        });

        Thread thread2 = new Thread(() -> {
            for (int i = 0; i < 10000_0000L; i++) {
                c.b = i;
            }
        });
        final long start = System.nanoTime();
        thread1.start();
        thread2.start();
        thread1.join();
        thread2.join();
        System.out.println((System.nanoTime() - start) / 100_0000);
    }
}

注意:需要加上启动参数-XX:-RestrictContended

posted @ 2020-10-20 20:00  R.困兽  阅读(625)  评论(0编辑  收藏  举报