Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате
Форум программистов > Java: Общие вопросы > Нужно ли синхронихировать Get метод возвращающий


Автор: Royan 2.8.2008, 16:02
Допустим я пишу thread-safe класс:

Код

public class ThreadSafe {
 
    private Vector<String> vector;
    private final ReentrantLock lock = new ReentrantLock(true);
 
    /** Обычный метод в этом классе выглядит так */
    public int someMethod() {
        lock.lock();
 
        try {
            // Do thread-safe things and change vector
            vector.clear()
        } finally {
            lock.unlock();
        }
    }
 
    /** Правильно ли писать данный метод без синхронизации? */
    public Vector<String> getVector() {
        return vector;
    }
}


Конечно, я бы не задумывался о какой-либо синхронизации если бы в моем классе работа шла только с классом Vector, на самом деле у меня полно кода, который надо синхронихировать, поэтому мой вопрос относится только к методу getVector(), а именно если весь класс синхронизирован через локи, то надо ли синхронихировать thread-safe коллекции когда работа идет только с ними?

Автор: niasilil 2.8.2008, 17:13
get возвращает reference и ничего с этим методом делать не надо в принципе. Эта операция safe

Автор: Royan 2.8.2008, 20:46
Цитата(niasilil @  2.8.2008,  14:13 Найти цитируемый пост)
get возвращает reference и ничего с этим методом делать не надо в принципе. Эта операция safe 

Думаю что да, мой вопрос несколько бессмымленен, потому что если даже рассмотреть вариант с изменением вектора внутри getVector() то самое большее чего можно достигнуть "залочив" метод getVector это синхронизировать другие операции относительно состояния всего класса ThreadSafe

Автор: yaja 4.8.2008, 17:13
Ну возвращать ссылку на внутренний объект vector, крайне опасно. Поскольку другой поток может сделать с ним что угодно, а твой класс об это ничего знать не будет. Поэтому синхронизировать этой метод тоже бессмысленно. 
Безопаснее и правильнее написать:
Код

public Vector<String> getVector() {
return new Vector<String>(vector);
}



Автор: niasilil 5.8.2008, 05:11
Цитата(yaja @ 4.8.2008,  17:13)
Ну возвращать ссылку на внутренний объект vector, крайне опасно. Поскольку другой поток может сделать с ним что угодно, а твой класс об это ничего знать не будет. Поэтому синхронизировать этой метод тоже бессмысленно. 
Безопаснее и правильнее написать:
Код

public Vector<String> getVector() {
return new Vector<String>(vector);
}

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

Powered by Invision Power Board (http://www.invisionboard.com)
© Invision Power Services (http://www.invisionpower.com)