Может ли кто-нибудь объяснить, что такое несинхронизированный и синхронизированный доступ в Java Collections Framework?
О несинхронизированном и синхронизированном доступе в Java Collections Framework?
Ответ 1
Синхронизированный или несинхронизированный доступ не связан с Framework коллекций Java для каждого вида.
Синхронизированный доступ означает, что для доступа к данным у вас есть тип блокировки. Это можно ввести с помощью ключевого слова synchronized
или с помощью некоторых конструкций более высокого уровня из пакета java.util.concurrent
.
Несинхронизированный доступ означает, что при доступе к данным у вас нет блокировки.
Если вы используете коллекцию в нескольких потоках, вы должны убедиться, что вы обращаетесь к ней синхронно или, что сама коллекция безопасный поток, т.е. заботится о такой блокировке внутри.
Чтобы обеспечить доступ к любому обращению к какой-либо коллекции coll
синхронизированным образом, вы можете либо
-
... обратный доступ с помощью
synchronized (coll) { ... }
public void someMethod() { synchronized (coll) { // do work... } }
-
... инкапсулировать его с помощью
Collections.synchronizedCollections
coll = Collections.synchronizedCollection(coll);
В первом подходе вам нужно убедиться, что каждый доступ к коллекции покрывается synchronized
. В последнем подходе вам нужно убедиться, что каждая ссылка указывает на синхронизированную версию коллекции.
Как уже отмечалось в @Fatal, вы должны понимать, что последний подход только трансформирует небезопасную коллекцию потоков в коллекцию потоковой безопасности. Этого чаще всего недостаточно, чтобы убедиться, что класс, который вы пишете, является потокобезопасным. Например, см. Комментарий @Fatals.
Ответ 2
Синхронизированный доступ означает, что он потокобезопасный. Таким образом, различные потоки могут получать доступ к коллекции одновременно без каких-либо проблем, но, вероятно, это немного медленнее в зависимости от того, что вы делаете.
Несинхронизировано - это противоположное. Не потокобезопасен, но немного быстрее.
Ответ 3
Синхронизированный доступ в Java Collection Framework обычно выполняется путем переноса с помощью Collections.synchronizedCollection(...)
и т.д. и только для доступа через эту оболочку.
Есть некоторые исключения, уже синхронизированные как Hashtable
и Vector
.
Но имейте в виду: Синхронизация выполняется над экземпляром коллекции и имеет возможность для каждого вызова метода. Поэтому последующие вызовы могут быть прерваны другим потоком.
Пример:
Сначала вы вызываете метод isEmtpy()
, получая результат, чтобы он не был пустым, и после этого вы хотите извлечь элемент из этой коллекции. Но этот вызов второго метода может завершиться неудачно, потому что теперь сбор может быть пустым из-за действий другого потока, выполняемого между вашими вызовами.
Таким образом, даже с синхронизированными коллекциями вы должны заботиться о синхронизации, и, возможно, вам необходимо синхронизировать себя за пределами коллекции!
Ответ 4
несинхронизированный и синхронизированный доступ в структуре коллекций Java.
I will explain with example in Java Collections Framework.
несинхронизированного
Список массивов не синхронизирован, что означает, что несколько потоков могут работать в списке массивов одновременно. Напр. если один поток выполняет операцию добавления в Array List, может быть другой поток одновременное выполнение операции удаления в списке массивов в нескольких потоковая среда.
синхронизированный
Вектор синхронизируется. Это означает, что если один поток работает с Vector, никакая другая нить не может ее удержать. В отличие от Array List, только один поток может выполнять операцию по вектору за раз.