Нужно ли синхронихировать Get метод возвращающий

 
0
 
Java
ava
Royan | 02.08.2008, 17: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 коллекции когда работа идет только с ними?
Ответы (4)
ava
niasilil | 02.08.2008, 17:13 #
get возвращает reference и ничего с этим методом делать не надо в принципе. Эта операция safe
ava
Royan | 02.08.2008, 20:46 #
Цитата (niasilil @ 2.8.2008, 14:13 findReferencedText)
get возвращает reference и ничего с этим методом делать не надо в принципе. Эта операция safe

Думаю что да, мой вопрос несколько бессмымленен, потому что если даже рассмотреть вариант с изменением вектора внутри getVector() то самое большее чего можно достигнуть "залочив" метод getVector это синхронизировать другие операции относительно состояния всего класса ThreadSafe
ava
yaja | 04.08.2008, 17:13 #
Ну возвращать ссылку на внутренний объект vector, крайне опасно. Поскольку другой поток может сделать с ним что угодно, а твой класс об это ничего знать не будет. Поэтому синхронизировать этой метод тоже бессмысленно.
Безопаснее и правильнее написать:

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


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

Безопаснее и правильнее написать:



public Vector<String> getVector() {

return new Vector<String>(vector);

}


Такой совет на все случаи жизни не работает. Даже более того, чаще так делать не стоит, потому что память она не резиновая и думать заранее куда она расходуется очень полезно.
Зарегистрируйтесь или войдите, чтобы написать.
Фирма дня
Вы также можете добавить свою фирму в каталог IT-фирм, и публиковать статьи, новости, вакансии и другую информацию от имени фирмы.
Подробнее
Участники
  Royan   yaja   niasilil
advanced
Отправить