Синхронизация в векторах в Java - PullRequest
9 голосов
/ 27 января 2010

то, что подразумевается под вектором в Java, является потокобезопасным и синхронизированным, как это сделано потокобезопасным. Я смотрю на внутренние детали реализации

Ответы [ 4 ]

18 голосов
/ 27 января 2010

Это сделано «поточно-ориентированным» благодаря всем синхронизируемым методам (через ключевое слово synchronized), см. Исходный код OpenJDK .

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

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

Рассмотрите этот пример, который показывает, что вам все еще нужно использовать синхронизацию в коде вашего приложения (чтобы вы могли с тем же успехом использовать несинхронизированный ArrayList):

 // BROKEN CODE, needs external synchronization
 // only add an element if the vector is empty
 if(vector.isEmpty())
     vector.add(anElement);
4 голосов
/ 27 января 2010

Vector считается «поточно-ориентированным», поскольку доступ к внутренним компонентам вектора синхронизирован. Такие методы, как add(), get(), size() и т. Д., Синхронизируются таким образом, что изменения внутренней структуры Vector и доступ к этой внутренней структуре не могут обрабатываться одновременно отдельными потоками.

0 голосов
/ 05 октября 2012

Найдите приведенные ниже выдержки из java api

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

Второй, когда синхронизированный методпри выходе из него автоматически устанавливается отношение «происходит до» с любым последующим вызовом синхронизированного метода для того же объекта.Это гарантирует, что изменения состояния объекта видны всем потокам.

0 голосов
/ 27 января 2010

Методы помечены как synchronized. Ознакомьтесь с учебником Синхронизированный метод .

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...