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