SORU
19 ŞUBAT 2009, PERŞEMBE


Java senkronize blok vs Derlemeleri.synchronizedMap

Aşağıdaki kodu doğru synchronizedMap çağrıları senkronize etmek için ayarlanmış?

public class MyClass {
  private static Map<String, List<String>> synchronizedMap = Collections.synchronizedMap(new HashMap<String, List<String>>());

  public void doWork(String key) {
    List<String> values = null;
    while ((values = synchronizedMap.remove(key)) != null) {
      //do something with values
    }
  }

  public static void addToMap(String key, String value) {
    synchronized (synchronizedMap) {
      if (synchronizedMap.containsKey(key)) {
        synchronizedMap.get(key).add(value);
      }
      else {
        List<String> valuesList = new ArrayList<String>();
        valuesList.add(value);
        synchronizedMap.put(key, valuesList);
      }
    }
  }
}

Benim anlayış, ben gereken senkronize blok addToMap() önlemek için başka bir iş parçacığı arama remove() containsKey() Daha önce geçeceğim çağrısı put() ama yapmam gereken bir senkronize blok doWork() çünkü başka bir iş parçacığı giremezsiniz senkronize blok addToMap() önce remove() döner çünkü ben yarattım Harita ilk Collections.synchronizedMap(). Bu doğru mu? Daha iyi bir yolu bunu yapmak için vardır?

CEVAP
19 ŞUBAT 2009, PERŞEMBE


Collections.synchronizedMap() harita üzerinde çalıştırmak istediğiniz her bir atom operasyon senkronize olacağını garanti eder.

İki (veya daha fazla) koşu haritada işlemleri ancak, bir blok içinde senkronize olması gerekir. Evet çok doğru senkronize ediyor.

Bunu Paylaş:
  • Google+
  • E-Posta
Etiketler:

YORUMLAR

SPONSOR VİDEO

Rastgele Yazarlar

  • mist64

    mist64

    30 Mayıs 2006
  • SegaAmerica

    SegaAmerica

    5 Mart 2008
  • sknbp

    sknbp

    16 Kasım 2006