синхронизировано methodName против синхронизировано (объект)
Это верно, и это одна из альтернатив. Я думаю, что было бы более эффективно синхронизировать доступ к этому объекту только вместо того, чтобы синхронизировать все его методы.
Хотя разница может быть незначительной, было бы полезно, если бы вы использовали один и тот же объект в одном потоке
т.е. (используя синхронизированное ключевое слово в методе)
class SomeClass {
private int clickCount = 0;
public synchronized void click(){
clickCount++;
}
}
Когда класс определяется таким образом, только один поток за раз может вызывать метод click
.
Что произойдет, если этот метод вызывается слишком часто в однопоточном приложении? Вы потратите дополнительное время на проверку того, сможет ли этот поток получить блокировку объекта, когда он не нужен.
class Main {
public static void main( String [] args ) {
SomeClass someObject = new SomeClass();
for( int i = 0 ; i < Integer.MAX_VALUE ; i++ ) {
someObject.click();
}
}
}
В этом случае проверка, может ли поток заблокировать объект, будет вызвана без необходимости Integer.MAX_VALUE
(2 147 483 647) раз.
Таким образом, удаление синхронизированного ключевого слова в этой ситуации будет выполняться намного быстрее.
Итак, как бы вы сделали это в многопоточном приложении?
Вы просто синхронизируете объект:
synchronized ( someObject ) {
someObject.click();
}
Вектор против ArrayList
Как дополнительное примечание, это использование ( syncrhonized methodName вместо syncrhonized (object) ), кстати, является одной из причин, по которой java.util.Vector
теперь заменяется на java.util.ArrayList
. Многие из методов Vector
синхронизированы.
В большинстве случаев список используется в однопоточном приложении или фрагменте кода (т. Е. Код внутри jsp / servlets выполняется в одном потоке), а дополнительная синхронизация Vector не способствует повышению производительности.
То же самое касается Hashtable
, заменяемого на HashMap