簡體   English   中英

Java線程和同步

[英]Java Threads and synchronization

我有一個網絡應用程序,它使用了我編寫的一些jar。 我的挑戰是我的代碼中有一個關鍵(但很快)的部分。

1-我有一個給定類的對象,該對象具有幾個static字段。 我們稱這個班為A類

2 _ A公開了訪問static字段的非靜態方法。 閱讀和寫作。 讓我們將此方法doJob

3-每個請求實例化一個類A的對象並調用doJob
A a = new A(); a.doJob();

4-我假設每個請求都在執行doJob地方創建一個新Thread

5-如果我將doJob定義為public synchronized void doJob () {//Do the job}僅一個Thread將執行該方法,其他Thread將繼續等待。

問題是:我在說什么好嗎?

沒錯,但是doJob將在實例級別同步,因此可以在兩個或更多個類A的兩個實例上同時由兩個或多個不同的線程同時執行doJob方法。如果希望doJob僅由一個線程在以下位置執行時間(例如,因為它破壞了靜態字段),您應該將其聲明為靜態,或者使用靜態字段作為鎖定對象來同步整個方法主體。

鑒於您正在嘗試使用非靜態(即每個對象一個)監視器來保護靜態(即每個類一個)字段,我想說“一次僅一個線程將執行該方法,而其他線程將繼續執行該方法。等待”聲明不成立。

沒有。

將實例方法標記為synchronized意味着與執行相同

public void myMethod() {
  synchronized(this) {
    ...
  }
}

因此,您只能保證兩個線程沒有運行同一對象的相同方法。 來自另一個對象的相同方法可以同時運行。

嘗試與更多“靜態”對象進行同步。 我將使用類對象本身,或某些靜態(且不可變)的成員。

是的,您的概述是正確的。 從技術上講,它確實使系統成為瓶頸,而其他線程等待訪問。 只要您避免在同步塊中進行任何繁重的處理或I / O,這就完全正常了。

暫無
暫無

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

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