簡體   English   中英

使用reentrant鎖在java中鎖定同步

[英]locking synchronization in java using reentrant lock

我有和使用可重入全局鎖的java中的應用程序,我有這樣的問題:

一個線程獲取可重入的全局鎖定,並且假設它在這個時間間隔內保持鎖定30秒它進行一些操作。 在此時間間隔內,所有其他線程都被阻止。 我的問題是我希望像RMI這樣的線程有機會執行。

什么是一個好的鎖定策略或優化,以便讓其他一些線程在短時間內獲得鎖定?

所以你基本上有一個應該在單線程環境中執行的作業隊列。 每次從此隊列輪詢之前,您需要按優先級對其條目進行排序。

abstract class JobEntry<V> implements Callable<V>{
    Date registeredAt;
    long runEstimationMs;
    JobType type;
}

因此,您可以為此條目提供稱重功能,並根據它或實施Comparable對條目進行排序。

而這幾乎就是它。 您可以將這些作業發送到單個線程的固定線程池。 如果需要中斷它們,則需要取消將來,每個作業都應該檢查Thread.interrupted()狀態。

這里最困難的部分是稱重功能,一種可能的構建方法可能是在您的系統上進行一系列實驗。

如果一個線程已獲得鎖定,則其他線程無法繼續,我們無法更改此行為。 現在要解決你的問題,我想提出的建議很少。

嘗試減少鎖定范圍,以便其他線程也有機會執行。 看看是否可以獲得真正需要的部件的鎖定並在此之后釋放鎖定的可能性。 因為正如你所說,一個線程需要花費大量時間,所以可能會有一部分代碼不需要鎖定。

operationInLock(){
----
lock.lock();
Code where lock is required;
lock.unlock();

Code where lock is Not required;
Code where lock is Not required;
Code where lock is Not required;

lock.lock();
Code where lock is required;
lock.unlock();

Code where lock is Not required;
Code where lock is Not required;
Code where lock is Not required;

}

如果您覺得這個答案沒有用,請給我們一些關於代碼/功能的更多信息,因為如果沒有看到代碼就很難給出解決方案,我們可以根據最佳實踐給出建議。

我相信這可以通過第一個線程獲取代碼的特定部分來實現,該線程具有30秒的全局鎖定,並且您還可以使用讀取和寫入java中的ReadWriteLock Object附帶的單獨鎖定。 ReadWriteLock由java.util.concurrent.locks包中的ReentrantReadWriteLock類實現。多個線程可以獲取多個讀鎖定,但只有一個線程可以獲取互斥的寫鎖定。其他請求readLocks的線程必須等到寫鎖定被釋放。 允許線程從寫鎖定降級到讀鎖定,但反之亦然。 允許讀取線程升級會導致死鎖,因為多個線程可以嘗試升級其鎖定。 ReentrantReadWriteLock還支持Reentrant鎖的所有功能,例如提供公平機制,重入鎖,條件支持(僅限寫鎖),允許讀取中斷以及寫入鎖定。

Condition對象(也稱為條件變量)為線程提供了暫停其執行的能力,直到條件為真。 Condition對象必然綁定到Lock,並且可以使用newCondition()方法獲取。

此外,條件通過使用Lock實現組合這些集合,實現了每個對象具有多個等待集的效果。 此外,由於條件訪問在不同線程之間共享的狀態部分,因此鎖的使用是強制性的。 值得一提的是,Condition必須以原子方式釋放相關的Lock並暫停當前的線程執行。

供您參考我給你的URL - > https://examples.javacodegeeks.com/core-java/util/concurrent/locks-concurrent/condition/java-util-concurrent-locks-condition-example/

https://examples.javacodegeeks.com/core-java/util/concurrent/locks-concurrent/readwritelock/java-readwritelock-example/

如果您需要其他幫助,請告訴我

暫無
暫無

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

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