я читал на официальном учебнике по многопоточности из oracle и я пришел пересечь этот пример (при условии, c1
и c2
никогда не используются вместе):Использование синхронизированных блоков для различных методов в одном классе
public class MsLunch {
private long c1 = 0;
private long c2 = 0;
private Object lock1 = new Object();
private Object lock2 = new Object();
public void inc1() {
synchronized(lock1) {
c1++;
}
}
public void inc2() {
synchronized(lock2) {
c2++;
}
}
}
}
Говорят что, используя блокировку 1 & lock 2, это помогает уменьшить ненужную блокировку по сравнению с использованием этого слова в синхронизированном блоке.
Однако я действительно не вижу, как это помогает уменьшить блокировку, поскольку они не имеют зависимости друг от друга. У меня есть несколько потоков, каждый из которых запускает эти два метода одновременно, и производительность довольно похожа, когда я использую объекты блокировки и это ключевое слово.
Может кто-нибудь помочь объяснить мое замешательство здесь? Любовь, чтобы увидеть объяснение с примером, чтобы ясно проиллюстрировать разницу.
Добавление к обсуждению здесь, это post помогли прояснить мои сомнения, а также. Ключевой момент: синхронизация по методу означает, что нить должна получить блокировку экземпляра объекта до ввода этого метода.
Чтобы увидеть разницу в производительности в этом случае, вам придется совершать большое количество вызовов, используя большое количество потоков, вызывающих ваши 2 метода случайным образом и одновременно. Однако, если вызовы делали больше, чем увеличивали переменную, то разница между 1 и 2 замками была бы более очевидной. – Gray