О несинхронизированном и синхронизированном доступе в 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, только один поток может выполнять операцию по вектору за раз.