что означает вектор в Java, является потокобезопасным и синхронизированным, как это сделать потокобезопасным. Я смотрю на внутренние детали реализации
Синхронизация в векторах в Java
Ответ 1
Сделано "поточно-безопасным" по достоинству всех его методов, синхронизированных (через ключевое слово synchronized), см. исходный код OpenJDK.
Что такое синхронизированное ключевое слово, так это то, что он предотвращает одновременное выполнение нескольких потоков одним и тем же способом. Он использует внутреннюю блокировку, которую должен получить поток при вводе этих методов, и что поток освобождается, когда он покидает метод.
Обратите внимание, что это не очень помогает, потому что, хотя это предотвращает противоречивое внутреннее состояние вектора, это никоим образом не гарантирует уровень согласованности на более высоком уровне (полезный уровень для приложения).
Рассмотрим этот пример, который показывает, что вам все еще нужно использовать синхронизацию в коде приложения (так что вы могли бы использовать несинхронизированный ArrayList):
// BROKEN CODE, needs external synchronization
// only add an element if the vector is empty
if(vector.isEmpty())
vector.add(anElement);
Ответ 2
Vector
считается "потокобезопасным", поскольку синхронизируется доступ к внутренним элементам вектора. Методы, такие как add()
, get()
, size()
и т.д., Синхронизированы так, что изменения внутренней структуры Vector
и доступа к этой внутренней структуре не могут обрабатываться одновременно отдельными потоками.
Ответ 3
Методы отмечены как synchronized
. Ознакомьтесь с Учебник по синхронизированному методу.
Ответ 4
Пожалуйста, найдите приведенные ниже отрывки из java api
Во-первых, невозможно, чтобы две вызовы синхронизированных методов на одном объекте чередовали. Когда один поток выполняет синхронизированный метод для объекта, все другие потоки, которые вызывают синхронизированные методы для одного и того же объекта (приостанавливать выполнение) до тех пор, пока первый поток не будет выполнен с объектом.
Во-вторых, когда синхронизированный метод завершается, он автоматически устанавливает связь между событиями и последующим вызовом синхронизированного метода для одного и того же объекта. Это гарантирует, что изменения состояния объекта будут видны для всех потоков.