Синхронизированный блок с закрытым неизменяемым объектом и разница методов синхронизации - PullRequest
0 голосов
/ 24 июня 2018
private final Object lockObject = new Object();
public void getCount() {
    synchronized( lockObject ) {
        ...
    }
}

Почему код выше, чем код ниже:

public void synchronized getCount() {
      ...
}

Я искал и нашел объяснение, как указано ниже.

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

Но я не мог понять это полностью. Как злобный пользователь может навсегда удерживать блокировку? Может ли кто-нибудь дать объяснение с примером кода, чтобы оправдать приведенный выше сценарий?

Ответы [ 2 ]

0 голосов
/ 24 июня 2018

Проще говоря -

Когда вы используете блокировку на уровне метода, вы получаете блокировку объекта полного класса, в котором у вас есть синхронизированный метод.

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

Это причина, по которой объекты монитора и синхронизированные блоки являются предпочтительным способом.

0 голосов
/ 24 июня 2018

С

public class Example {
    public void synchronized getCount() {
            ...
    }
}

он синхронизируется на текущем объекте this.Другой класс может получить ссылку на текущий объект и использовать ее в качестве блокировки монитора:

public class OtherClass {

    public void otherMethod() {
        Example example = new Example();
        synchronized (example) {
            ...
        }
    }
}

Это может привести к неожиданным результатам, например, к блокировке getCount при выполнении otherMethod.

При первом подходе, поскольку блокировка монитора lockObject является закрытой, другой класс не может получить к ней доступ напрямую, поэтому он предпочтительнее второго подхода.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...