Выписки из книги которого я читальныйСинхронизировать на тот же замок
// Синхронизировать на ложном замке, следовательно @NotThreadSafe
public class ListHelper<E> {
public List<E> list = Collections.synchronizedList(new ArrayList<E>());
public synchronized boolean putIfAbsent(E x){
boolean absent = !list.contains(x);
if(absent)
list.add(x);
return absent;
}
}
// Synchromize на тот же/правильном замок, следовательно @ThreadSafe
// Реализация Put-if-absent с блокировкой на стороне клиента.
public class ListHelper<E> {
public List<E> list = Collections.synchronizedList(new ArrayList<E>());
public boolean putIfAbsent(E x){
synchronized(list){
boolean absent = !list.contains(x);
if(absent)
list.add(x);
return absent;
}
}
}
Двигаясь быстро на, автор переходит к 3-прецедентного
// Реализация пут-если отсутствовавший с использованием композиции.
public class ImprovedList<E> implements List<E> {
private final List<E> list;
public ImprovedList(List<E> list){
this.list = list;
}
public synchronized boolean putIfAbsent(E x){
boolean contains = list.contains(x);
if(contains)
list.add(x);
return !contains;
}
}
Как выше класс @ThreadSafe
, даже когда list
в public final List<E> list;
мощь not be @ThreadSafe
Тот список, будучи публично, не является потокобезопасным. Что это за книга? – markspace
Joshua bloch JCIP –
Неправильно вызывать любой из вышеперечисленных классов «потокобезопасный», когда «list' member« public ». –