Выполнение synchronized (new Object()) { ... }
вообще бесполезно, так как никакой другой поток никогда не получит объект, который все равно заблокирован.
Вы должны синхронизироваться с объектом, "охраняющим" ресурс.Очевидно, что если нескольким потокам необходим доступ к одному и тому же ресурсу, объект, защищающий ресурс, должен быть доступен обоим потокам.
Возможно, вы видели это:
class SomeClass {
final private Object lock = new Object();
void method() {
...
synchronized (lock) {
...
}
...
}
}
сильно отличается от выполнения synchronized (new Object())
, так как в приведенном выше коде один и тот же объект используется для всех потоков, выполняющих метод.
, но я часто вижу синхронизацию одного хэш-карты, когда необходимо, чтобы хеш-карта была нитьsafe.but я думаю, что могу использовать еще один объект вместо hashmap.Итак, какой объект лучше синхронизировать?
Правильно, если хэш-карта является ресурсом, который должен быть разделен между несколькими потоками, то для этого объекта обычно выполняется синхронизация.
synchronized (someHashMap) {
... use someHashMap in a thread safe way ...
}
И да, вы также можете синхронизироваться с некоторым полем lock = new Object()
.На самом деле синхронизация с использованием выделенного объекта блокировки иногда предпочтительнее, поскольку она не мешает синхронизированным методам защищаемого объекта.