Я пытаюсь понять разницу между классами Vector и ArrayList с точки зрения потокобезопасности. Vector предположительно внутренне синхронизирован. Синхронизируется ли он по каждому элементу или в целом? (Я мог бы представить себе случай, когда несколько потоков могут получить доступ к вектору одновременно, но несколько потоков не могут одновременно получить доступ к одному и тому же элементу). Если вы посмотрите на приведенный ниже код, getAo()
не эквивалентен getV()
, потому что ключевое слово synchronized
при использовании в сигнатуре метода синхронизируется с содержащим его объектом класса (экземпляром VectorVsArrayList
), насколько мне известно. ОДНАКО, getAoSync()
эквивалентно getV()
? Под эквивалентом я подразумеваю, начинает ли переменная экземпляра ao
вести себя как объект Vector с точки зрения синхронизации, если весь доступ к нему осуществляется через метод получения?
public class VectorVsArrayList {
private ArrayList<?> ao = null;
private Vector<?> v = null;
public ArrayList<?> getAoSync(){
synchronized(ao){
return ao;
}
}
public synchronized ArrayList<?> getAo() {
return ao;
}
public Vector<?> getV() {
return v;
}
}
Vector
для во всех смыслах и целях устарел, не используйте его. Его использование считается плохой практикой. Пример: использованиеVector
для ответа на вопрос на доске во время собеседования — отличный способ немедленно потерпеть неудачу. Кроме того, наивный подход к синхронизации в основном бесполезен в реальном мире, как и оберткиCollections.syncronizedXXX
. - person   schedule 20.03.2014