1. Видимость
Этот метод не подведет. При синхронизации каждый раз, когда вы доступ к полю, изменения к нему гарантированно будут видны каждый раз, когда нить имеет тот же замок, как показано ниже:
От Java Параллелизм В практике [pdf], Рисунок 3.1
Поэтому не обязательно, чтобы поле было изменчивым. Вероятно, вам намного лучше, используя методы AtomicInteger
getAndIncrement()
и incrementAndGet()
, которые работают с той же целью, но с лучшей пропускной способностью параллелизма (они используют встроенную функциональность вместо блокировки, они были разработаны именно для этой задачи), но убедитесь, что указана память в AtomicInteger
(самый простой способ сделать это - сделать его окончательным - он не сделает значение AtomicInteger
окончательным).
public class Aufzahlen {
private final AtomicInteger atomicInt = new AtomicInteger(1); // set initial value with constructor argument
public void aufzahlen() {
atomicInt.incrementAndGet();
} // no need for synchronization because updates are atomic and are automatically visible
}
2. Атомарность
я мог бы использовать «атомный» один или два раза в этой должности, то это означает, что никакие два потока не могут быть одновременно выполняет один и тот же код, или, другими словами, что операция не может быть «разделена» на несколько частей, в которые одновременно могут входить несколько потоков.
+--- Function aufzählen() without synchronization and with i++ ---------------+
| |
| [Get i from field] --> [Increment i locally] --> [Write new value to field] |
| ^ ^ |
| | | |
| "Race condition", multiple threads could be at these stages |
| -> operation not atomic |
+-----------------------------------------------------------------------------+
Я просто demonstated, что не является атомарным, вы можете сделать эту операцию атомной с помощью synchronized
(следующий потока должен ждать первый закончить весь метод), или вы можете использовать AtomicInteger
, который делает эту атомарность для вы.
Если вы правильно синхронизируете все другие обращения к 'cc', то нет, переменная не должна быть изменчивой. Как есть, переменная cc бесполезна, поскольку никто ее не читает.Не знаете, почему у вас есть 'throws InterruptedException'. Кроме того, вы можете использовать 'cC++'. –
Я отредактировал метод для чтения переменной –
Синхронизировать доступ к cc в порядке. Как уже упоминалось JB. Вы также можете использовать AtomicInteger, если заботиться только о cc. – Dwijendra