2008-12-05 2 views
0

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

[обновлено]

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; 
    } 
} 
+0

oh goody, больше downmarking без комментариев. Было ли это, что я использовал Java, а не C#? – fiddlesticks 2008-12-05 11:20:46

+0

Наверное, это не вопрос для обсуждения или помощи .. это в основном викторина. Некоторые люди, вероятно, не идут на это в вопросе ... – Cowan 2009-01-11 09:25:46

+0

Только для записи (просто заметили это), вероятно, немного странно использовать британскую/австралийскую «-изменение» в названии - хотя я предпочитаю это , ключевое слово java - -ize, чтобы сделать его более доступным для поиска. :) – Cowan 2009-01-11 09:27:34

ответ

12

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

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

0

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

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

1

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

Смежные вопросы