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
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.
Bir avantaj Senkronize bir Blok yerine...
Senkronize(bu) Java önlemek?...
C# java'senkronize anahtar kelime...
Neden “senkronize” Java 8'de İzin Veri...
Nasıl senkronize statik yöntemler Java...