2009-11-24 2 views
36

я нужен Потокобезопасная карту, у меня есть что-то вроде этого: (я новичок в 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 
     } 

     } 
+0

Обратите внимание, изменяемые статики являются действительно, действительно, действительно плохая идея. –

ответ

1

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

2

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

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.

1

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

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

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

Прошу прощения, это статический класс, я обновлю вопрос – Omu

24

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

+0

Это лучший ответ принятого для присутствия интересного IBM ссылка – Pino

0

из 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) 
Смежные вопросы