Подтвердить что ты не робот

Файловая безопасность для java

Мне нужна безопасная по потоку карта, у меня есть что-то вроде этого: (я очень новичок в java)

 public static class Manager
        {
        static 
        {
//something wrong here, doesn't compile
           list = new java.util.Collections
          .synchronizedMap(new Map<String, Client>());
        }

       static Map<String,Client> list;

        public static void AddClient(Client client)
        {
        // thread safe add client to the list
        }

        public static void RemoveClient(Client client)
        {
        // thread safe remove client to the list
        }

        }
4b9b3361

Ответ 2

Класс ConcurrentHashMap из пакета java.util.concurrent представляет собой потокобезопасную реализацию Map, которая предлагает гораздо лучшее concurrency, чем synchronizedMap (и значительно превосходит масштабируемость над Hashtable). См. http://www.ibm.com/developerworks/java/library/j-jtp07233.html.

Ответ 4

Ваш код должен выглядеть так, игнорируя импорт и т.д.

public class Manager
{
    Map<String,Client> list = java.util.Collections.synchronizedMap(new HashMap<String, Client>());

    public void AddClient(Client client)
    {
        // thread safe add client to the list
    }

    public void RemoveClient(Client client)
    {
        // thread safe remove client to the list
    }
}

Тем не менее, остерегайтесь, что это не так потокобезопасно, как вы могли бы надеяться. Как уже упоминалось, вы, вероятно, захотите использовать Java Concurrent Collections.

Ответ 5

Ваш "список" вашей карты должен быть статическим, если вы хотите получить к нему доступ в статическом блоке.

Ответ 6

Вы не можете инициализировать переменную-член объекта в статическом блоке. Статические блоки выполняются один раз, когда класс сначала загружается, а не один раз для каждого объекта этого класса, тогда как переменная "список" создается один раз для каждого объекта класса.

Кроме того, вы не можете создавать экземпляр "новой карты", поскольку Map является интерфейсом. Вам нужно обернуть синхронизированную карту вокруг реальной карты, как HashMap или TreeMap.

        {
           list = new java.util.Collections
          .synchronizedMap(new HashMap<String, Client>());
        }

Ответ 7

из java.util.concurrent

ConcurrentHashMap<K,V>
ConcurrentMap<K,V>
ConcurrentNavigableMap<K,V>
ConcurrentHashMap<K,V>
ConcurrentSkipListMap<K,V>

из java.util.Collections

Collections.synchronizedMap(Map<K,V> m)
Collections.synchronizedNavigableMap(NavigableMap<K,V> m)
Collections.synchronizedSortedMap(SortedMap<K,V> m)