2016-03-29 25 views
1

olduğu zaman statik nesnesinin genel modifikasyonunu önleyin İki sınıf var, Birinci sınıf (ClassServletA.java), HashMap'te ipaddress ve erişim süresini depolayan HttpServlet'tir, Hash Hash'ı yedeklemek istiyorum Günlük olarak DB, Bu yüzden Görev zamanlama ve statik HashMap nesnesini DB'de saklamak ve HashMap'i (DB'de saklandıktan sonra) yeniden başlatıyorum.Bir iş parçacığı özellikle blok

Statik Nesneyi Global Olarak Kilitlemek Mümkün mü?

public class ClassServletA { 
    public static Map<String,String> myMap = new HashMap<String, String>(); 

    void doGet(HttpServeltRequest request , HttpServletResponse response){ 
    myMap.put("ipaddress", "accessTime"); 
    } 
} 

İkinci sınıf zamanlayıcısı:

public class MyDailyTask implements Job { 
    void executeMethod(){ 
    //Writing the map object to file or database login here 
    ByteArrayOutputStream bos = new ByteArrayOutputStream(); 
    ObjectOutputStream out = new ObjectOutputStream(bos); 
    out.writeObject(ClassServletA.myMap); 
    out.flush(); 
    out.close(); 
    // Reinitialize the hashmap 
    ClassServletA.myMap=new HashMap<String,String>(); 
    } 
} 

o kilit veya genel olarak zamanlama süre içinde ClassServletA.myMap ilk nesne değişiklik önlemek için mümkün olduğunda zamanlayıcı (MyDailyTask.java) yürütür executeMethod().

+0

İşte aklınıza gelebilecek bir çözüm: 1. İçinde 'boolean' bayrağı bulunan bir 'final' sınıfı oluşturun ve varsayılan olarak 'true' olarak ayarlayın. 2. Bu bayrağı 'executeMethod()' ın başlangıcında 'false 'olarak ayarlayın ve sonunda sıfırlayın. 3. Bu bayrakların değerini, haritayı değiştirdiğiniz her yerde kontrol edin ve sadece bayrak "true" ise değiştirin. – user2004685

+0

, HttpServlet cihazımın trafiği, iş planlanırken HashMap'teki bazı girişleri kaybedecek olursa daha fazla olacaktır. –

cevap

1

durumda, sadece executeMethod gerçekleştirirken myMap modifiye olmadığından emin olmak için, ama istediğiniz durumda bir AtomicReference

public class ClassServletA { 
    public static final AtomicReference<Map<String,String>> myMap = new AtomicReference(new HashMap<>()); 

    void doGet(HttpServeltRequest request , HttpServletResponse response){ 
    myMap.get().put("ipaddress", "accessTime"); 
    } 
} 

public class MyDailyTask implements Job { 
    void executeMethod(){ 
    //Writing the map object to file or database login here 
    ByteArrayOutputStream bos = new ByteArrayOutputStream(); 
    ObjectOutputStream out = new ObjectOutputStream(bos); 
    out.writeObject(ClassServletA.myMap.getAndSet(new HashMap<>())); 
    out.flush(); 
    out.close(); 
    } 
} 

kullanabilirsiniz diğer parçacıkları için bu bilgilere erişimi engellemek istemiyoruz myMap erişimini engellemek için ReadWriteLock kullanmayı düşünün. Bu konuyla ilgili diğer SO sorularına bakın: Java Concurrency: ReadWriteLock on Variable

Her iki durumda da HashMap güvenli değildir ve eşzamanlı erişim için uygun senkronizasyon gerektirir. Bkz. Java Multithread Access Static Variable

İlgili konular