2016-01-01 2 views
1

Я читаю B. Goetz Java Параллелизм в pratcice и вопрос о так называемой концепции владения объектами. Вот что он сказал:Понимание владения объектами в Java

Класс обычно не владеет объектами, переданные в его методу или конструкторов, если метод не предназначен для явного передачи собственности на объекты, переданных в (например, синхронизированной коллекции обертки завода методы).

Collections.synchronizedCollection(Collection) source является:

public static <T> Collection<T> More ...synchronizedCollection(Collection<T> c) { 
    return new SynchronizedCollection<T>(c); 
} 

где конструктор SynchornizedCollection «s является:

SynchronizedCollection(Collection<E> c) { 
    if (c==null) 
     throw new NullPointerException(); 
    this.c = c; 
    mutex = this; 
} 

Таким образом, если мы называем этот метод следующим образом:

List<Date> lst; 
//initialize the list 
Collection<Date> synchedLst = Collections.syncrhonizedCollection(lst); 
//modify lst's content 

мы могли бы изменить содержимое списка позже, так что Я бы сказал, что синхронизированные обертки имеют совместное владение.

Что не так с этим?

ответ

2

Что не так с этим?

Вы не читали документацию.

https://docs.oracle.com/javase/8/docs/api/java/util/Collections.html#synchronizedCollection-java.util.Collection-

Возвращает синхронизированный (потокобезопасный) сбор подкрепленную указанной коллекции. Чтобы гарантировать последовательный доступ, крайне важно, чтобы весь доступ к коллекции поддержки осуществлялся через возвращенную коллекцию.

Так документация говорит вам НЕ сохранить ссылку на исходный список и изменить его. Вы должны пройти возвращенную коллекцию, или она не работает.

Я не думаю, что есть какой-либо способ обеспечить право собственности на Java программным путем. Авто-указатели не могут существовать (или, по крайней мере, они не реализованы, поэтому API не использует их). Вам просто нужно прочитать документы и написать правильный код.

Смежные вопросы