Файловая безопасность для 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
}
}
Ответы
Ответ 2
Класс ConcurrentHashMap
из пакета java.util.concurrent
представляет собой потокобезопасную реализацию Map, которая предлагает гораздо лучшее concurrency, чем synchronizedMap
(и значительно превосходит масштабируемость над Hashtable
). См. http://www.ibm.com/developerworks/java/library/j-jtp07233.html.
Ответ 3
Используйте ConcurrentHashMap
Ответ 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)