Синхронизация с объектом, который будет создан - PullRequest
1 голос
/ 22 сентября 2011

Есть ли какие-либо проблемы с синхронизацией / ссылкой в ​​этом коде?

(Предположим, что myStrings уже создан.)

MySynch.java:

public class MySynch
{
    public static String[] myStrings = new String[10];

    public static void updateStrings()
    {
        synchronized (myStrings)
        {
            myStrings = new String[10]; // Safe?

            myStrings[0] = something[0];
            myStrings[1] = somethingElse[4];
        }
    }
}

Массив объектов myStrings может быть прочитан более чем одним потоком и имеет один поток, который обновляет (записывает) его, выполняя updateStrings().Потоки, которые читают из него, также будут использовать блок synchronized (myStrings) для чтения из него, конечно, для безопасности.

Существуют ли проблемы с блокировкой массива и его созданием снова внутри synchronized блок, который его блокирует (как указано выше)?

Ответы [ 4 ]

4 голосов
/ 22 сентября 2011

Существует проблема синхронизации: когда myStrings установлен на новый экземпляр, а второй поток выполняет метод сразу после этого, этот второй поток синхронизирует второй экземпляр myStrings.

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

synchronized(MySynch.class) {
    ...
}
2 голосов
/ 22 сентября 2011

Вы получите непоследовательное значение для myStrings, лучше иметь два синхронизированных блока или метода: один для обновления, а другой для получения блокировки класса, и ваш myStrings будет закрыт.

// update
synchronized (YourClass.class) {
    // update
}

// get
synchronized (YourClass.class) {
    // get
}
2 голосов
/ 22 сентября 2011

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

1 голос
/ 22 сентября 2011

Очиститель, ИМО.

public class MySynch {
private static AtomicReference<String[]> myStrings = new AtomicReference<String[]>(
        new String[0]);

public static void updateStrings() {
    String[] tmp = new String[2];
            ....
    myStrings.set(tmp);

}

public static String[] getStrings() {
    return myStrings.get();
}

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