亚洲在线久爱草,狠狠天天香蕉网,天天搞日日干久草,伊人亚洲日本欧美

為了賬號安全,請及時綁定郵箱和手機立即綁定
已解決430363個問題,去搜搜看,總會有你想問的

運行時之前未知的多個對象作為 Java 線程的鎖

運行時之前未知的多個對象作為 Java 線程的鎖

慕森卡 2022-07-27 21:32:56
我有一組資源,它們是Resource類的實例。系統中有作業在運行時進入。每個作業都需要一組這些資源,并且必須獨占使用它繼續進行所需的所有資源。也就是說,為了讓作業能夠啟動,它必須獲取它需要的所有資源的鎖,并在完成后釋放它獲取的所有這些鎖。因此,除非它需要的所有資源的所有鎖都可用,否則作業無法開始其處理。作業需要的資源在運行時之前是未知的。作業需要的資源列表作為Collection ArrayList<Resource>.這樣做的一種方法是,在run()每個作業線程的方法中,我可以同步“這個”作業所需的所有資源的鎖。synchronized (resource1) {    synchronized (resource2) {        ...    }}但這是硬編碼并且無法完成,因為作業所需的資源僅在運行時才知道。我能想到的另一種方法是將資源放在集合結構中,這樣,當獲取該集合的鎖時,該集合中所有條目的鎖也會被獲取,并且其他任何人都無法使用。有Collections.synchronizedList()。但是,它只鎖定List,而不鎖定列表中的對象。如何才能做到這一點?
查看完整描述

2 回答

?
繁花如伊

TA貢獻2012條經驗 獲得超12個贊

使用循環怎么樣,您在運行時遍歷Resources可用列表,然后在每次迭代時獲取對象上的鎖,這是一個示例,我在Object該類中演示了這一點:


public static void main(String[] args) {

       List<Object> list = new ArrayList<>();

       list.addAll(Arrays.asList(new Object(), new Object(), new Object()));

       Runnable run = () -> {

           for(Object o: list) {

               synchronized (o) {

                   System.out.println("Current thread " + Thread.currentThread().getName());

                   System.out.println(o.hashCode());

                   try {

                       Thread.sleep(2000);

                   }catch (InterruptedException ie){

                       ie.printStackTrace();

                   }

                   //do something useful

               }

           }

       };

       new Thread(run, "t1").start();

       new Thread(run, "t2").start();

       new Thread(run, "t3").start();

       new Thread(run, "t4").start();

 } 

當一個線程獲得了特定對象的鎖時,其他線程將等待它,但它們可以自由地從 for-each 循環中獲取下一個可用對象的鎖。


查看完整回答
反對 回復 2022-07-27
?
翻過高山走不出你

TA貢獻1875條經驗 獲得超3個贊

您可以為 List 接口編寫自己的實現,并在列表中查詢資源時鎖定資源。

https://docs.oracle.com/javase/8/docs/api/java/util/List.html


查看完整回答
反對 回復 2022-07-27
  • 2 回答
  • 0 關注
  • 143 瀏覽
慕課專欄
更多

添加回答

舉報

0/150
提交
取消
微信客服

購課補貼
聯系客服咨詢優惠詳情

幫助反饋 APP下載

慕課網APP
您的移動學習伙伴

公眾號

掃描二維碼
關注慕課網微信公眾號