Опрос синхронизации Java - PullRequest
       5

Опрос синхронизации Java

0 голосов
/ 05 декабря 2008

Вот код, который я видел один раз. Вы видите, что с ним не так?

[обновлено]

public class ResourceManager1
{
    private final String mutex = "";
    Object resource = null;

    public Object getResource()
    {
        synchronized (mutex)
        {
            if (resource == null)
            {
                resource = new Object();
            }
        }

        return resource;
    }
}

public class ResourceManager2
{
    private final String mutex = "";
    Object resource = null;

    public Object getResource()
    {
        synchronized (mutex)
        {
            if (resource == null)
            {
                resource = new Object();
            }
        }

        return resource;
    }
}

Ответы [ 3 ]

12 голосов
/ 05 декабря 2008

Никогда не синхронизировать строки, особенно строковые литералы, которые интернированы. У вас в основном только один замок.

Как правило, никогда не синхронизируйте ни одну ссылку, которая может быть видна за пределами вашего класса (включая «this») , если цель внешней видимости не предназначена именно для целей блокировки. Я обычно использую переменную private final, созданную исключительно для блокировки.

1 голос
/ 05 декабря 2008

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

0 голосов
/ 05 декабря 2008

мьютекс не является окончательным и ресурс не является частным.

Кроме того, вам нужен метод getResource, который возвращает ресурс, но я полагаю, что это просто опечатка.

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