Я новичок в Java и пытаюсь изучить концепцию синхронных операторов. Я видел абзац и код ниже из Java Tutorial Oracle. Мой вопрос:Синхронизированные операторы - создавать объекты для обеспечения блокировок, поэтому обновление c1 не будет чередоваться с обновлением c2
1) В каких обстоятельствах обновление c1 чередуется с обновлением c2.
2) Как блокировать объект 'lock1' и 'lock2' предотвращать обновление c1 чередуется с обновлением c2.
Я действительно пытаюсь понять концепцию.
Синхронизированные операторы также полезны для улучшения параллелизма с мелкозернистой синхронизацией . Предположим, например, что класс MsLunch имеет два поля экземпляра c1 и c2, которые никогда не используются вместе. Все обновления этих полей должны быть синхронизированы, но нет причин для предотвратить обновление чередованием 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) Thread 1 вызывает inc1, в то время как Thread 2 вызывает inc2. 2) Вы читаете это неправильно. Использование 2 блокировок НЕ предотвращает чередование обновлений c1 с обновлениями c2. Это хорошо, потому что (как говорится в тексте) НЕТ НУЖНО. Синхронизация на 'this' вместо этого предотвратит одновременное выполнение inc1 и inc2. –
Обратите внимание, что если вы не сможете сделать объекты блокировки окончательными, теоретически существует проблема для проблем. – chrylis