Создание объекта класса как синхронизированной переменной - PullRequest
0 голосов
/ 23 мая 2011
    private static class RunningMutex {}
    private static class ObserveMutex {}

    private static volatile RunningMutex runningMutex = new ImportActionRunningMutex();
    private static volatile ObserveMutex observeMutex = new ImportActionObserveMutex();



    synchronized (observeMutex) {......}  .... (1)
    synchronized (runningMutex) {......}  .....(2)

Полезно ли иметь код, подобный приведенному выше?В настоящее время я выполняю рефакторинг большого кода, который не работает должным образом, и я обнаружил эти строки.Я хотел бы знать, есть ли какая-либо альтернатива приведенному выше коду.

1 Ответ

1 голос
/ 23 мая 2011

Это не редкость, когда вы хотите изолировать разные блокировки друг от друга в одном и том же классе или если вы хотите использовать одну и ту же блокировку для разных классов. Строго не обязательно создавать указанные классы для каждой отдельной блокировки (можно просто использовать разные экземпляры Object), но это очень помогает при анализе дампов потоков, поскольку будет ясно, какой поток принадлежит какому монитору.

Опасность заключается в том, что вы можете создавать ситуации тупиковой блокировки, если не будете осторожны (поток X блокирует монитор A, поток Y блокирует монитор B, поток X пытается заблокировать монитор B, поток Y пытается заблокировать монитор A).

...