Что такое "false sharing" в многопоточном Java-приложении и как его можно избежать?
Ответ ⬇️
"False sharing" — это ситуация, когда несколько потоков обновляют разные переменные, находящиеся в одном кэше процессора. Это приводит к снижению производительности из-за необходимости синхронизации кэшей. Чтобы избежать "false sharing", можно использовать аннотацию @Contended (с включенной опцией JVM) или добавлять дополнительные поля для выравнивания.
🗣 Пример:
public class Main {
private static class Counter {
// Добавляем дополнительные поля для выравнивания
private long p1, p2, p3, p4, p5, p6, p7;
public volatile long count = 0;
private long q1, q2, q3, q4, q5, q6, q7;
}
public static void main(String[] args) throws InterruptedException {
Counter counter = new Counter();
Thread thread1 = new Thread(() -> {
for (int i = 0; i < 1_000_000; i++) {
counter.count++;
}
});
Thread thread2 = new Thread(() -> {
for (int i = 0; i < 1_000_000; i++) {
counter.count++;
}
});
thread1.start();
thread2.start();
thread1.join();
thread2.join();
System.out.println("Итоговое значение: " + counter.count);
}
}
// Результат выполнения:
// Итоговое значение: 2000000
Java Learning 👩💻