Модераторы: LSD, AntonSaburov
  

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> Нужно ли синхронихировать Get метод возвращающий, thread-safe коллекцию 
V
    Опции темы
Royan
  Дата 2.8.2008, 16:02 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Dreamer
***


Профиль
Группа: Участник Клуба
Сообщений: 1708
Регистрация: 14.9.2002
Где: Лондон

Репутация: 3
Всего: 15



Допустим я пишу 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 коллекции когда работа идет только с ними?


--------------------
Открыта вакансия Junior Java Developer'а в нашем лондонском офисе, подробнее можно узнать здесь
PM MAIL MSN   Вверх
niasilil
Дата 2.8.2008, 17:13 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 325
Регистрация: 4.6.2007
Где: USA

Репутация: 8
Всего: 9



get возвращает reference и ничего с этим методом делать не надо в принципе. Эта операция safe


--------------------
SCJP 5.0, SCJD
PM MAIL   Вверх
Royan
Дата 2.8.2008, 20:46 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Dreamer
***


Профиль
Группа: Участник Клуба
Сообщений: 1708
Регистрация: 14.9.2002
Где: Лондон

Репутация: 3
Всего: 15



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

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


--------------------
Открыта вакансия Junior Java Developer'а в нашем лондонском офисе, подробнее можно узнать здесь
PM MAIL MSN   Вверх
yaja
Дата 4.8.2008, 17:13 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 98
Регистрация: 30.3.2005
Где: Санкт-Петербург

Репутация: нет
Всего: 1



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

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



PM MAIL   Вверх
niasilil
Дата 5.8.2008, 05:11 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 325
Регистрация: 4.6.2007
Где: USA

Репутация: 8
Всего: 9



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

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

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


--------------------
SCJP 5.0, SCJD
PM MAIL   Вверх
  
Ответ в темуСоздание новой темы Создание опроса
Правила форума "Java"
LSD   AntonSaburov
powerOn   tux
javastic
  • Прежде, чем задать вопрос, прочтите это!
  • Книги по Java собираются здесь.
  • Документация и ресурсы по Java находятся здесь.
  • Используйте теги [code=java][/code] для подсветки кода. Используйтe чекбокс "транслит", если у Вас нет русских шрифтов.
  • Помечайте свой вопрос как решённый, если на него получен ответ. Ссылка "Пометить как решённый" находится над первым постом.
  • Действия модераторов можно обсудить здесь.
  • FAQ раздела лежит здесь.

Если Вам помогли, и атмосфера форума Вам понравилась, то заходите к нам чаще! С уважением, LSD, AntonSaburov, powerOn, tux, javastic.

 
0 Пользователей читают эту тему (0 Гостей и 0 Скрытых Пользователей)
0 Пользователей:
« Предыдущая тема | Java: Общие вопросы | Следующая тема »


 




[ Время генерации скрипта: 0.0663 ]   [ Использовано запросов: 22 ]   [ GZIP включён ]


Реклама на сайте     Информационное спонсорство

 
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности     Powered by Invision Power Board(R) 1.3 © 2003  IPS, Inc.