簡體   English   中英

多個方法之間的Java同步

[英]java synchronization between multiple methods

class xyz {

    private Object lock = new Object();

    // value will come from database
    private boolean deleteOncePerDay; 

    private void clearAll() {
        synchronized (lock) {
            if(!deleteOncePerDay) {
                database.deleteNames();
                database.deleteAddresses();
                database.deletePhoneNums();

                // set database value to true
                deleteOncePerDay = true;
            }
        }   
    }

    @Scheduled(fixedDelay = 50000)
    public void fetchNames() {
        clearAll();
        synchronized (lock) {
            database.saveNames();
        }
    }

    @Scheduled(fixedDelay = 50000)
    public void fetchAddresses() {
        clearAll();
        synchronized (lock) {
            database.saveAddresses();
        }
    }

    @Scheduled(fixedDelay = 50000)
    public void fetchPhoneNums() {
        clearAll();
        synchronized (lock) {
            database.savePhoneNums();
        }
    }

}

3種提取方法在不同的線程中工作,每種提取方法花費不同的時間來保存其數據。

我的目標:

  1. 當一個線程正在刪除(ClearAll)數據時,沒有其他線程可以同時保存數據。

  2. 當一個線程正在保存數據時,其他任何線程都不應刪除數據。

  3. 當沒有線程在clearAll()上運行時,所有線程可以同時保存數據。

通過以上操作,我想我達到了1&2。但是我錯過了3。由於每種獲取方法都被同步塊包圍,因此只有獲取方法會在時間鎖定,因此不滿足條件3。

有人能幫我嗎?

在這種情況下,可以在Java中使用ReadWriteLock 代替使用synchronized(lock){}塊,如下所述。

// Initialization
ReadWriteLock lock=new ReentrantReadWriteLock();

clearAll()方法中。

lock.writeLock().lock();
try{
    // Do your stuff here
} finally{
    lock.writeLock().unlock();
}

在所有其他方法中,只需獲取讀鎖即可完成工作。

lock.readLock().lock();
try{
    // Do your stuff here
} finally{
    lock.readLock().unlock();
}

ReadWriteLock允許任意數量的線程獲取讀取鎖,但要獲取寫入鎖,必須釋放所有讀取鎖。 此外,采取寫鎖定時不會發生任何讀操作。

另外,我認為您應該研究數據庫事務,您可以在數據庫級別實現所有這些事務

@Scheduled(fixedDelay = 50000)
    public void whatever() {
        clearWhatever(); // no one passed barrier, no saves happening
        CyclicBarrier();
        database.saveWhatever(); // all passed barrier, no clears happening.

    }

根據您的1,2,3情況,這應將工作分為清晰並保存而不會出現並發問題。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM