2012-12-13 117 views
0

同步的塊,並與下面的場景同步方法之間請,我有疑問:Java同步處理

第一部分 --------------:

Class table 
{ 
    Synchronized(this) 
    { 
     …………………… 
    } 
} 

這裏我們鎖定了表類的對象。 -------------------------------------- ...

第2部分:

Class table 
{ 
    Customer cust=new Customer(); 
    Synchronized(cust) 
    { 
     …………………… 
    } 
} 

這裏我們鎖定了customer.ie的對象cust 在part1中,我們鎖定了表類的對象。 因爲表類的對象可能試圖同時訪問來自不同位置的已同步的
塊,所以我們鎖定了表類。爲了防止它,我們鎖定了第1部分中的表類
的對象。 現在來到part2:? - 這裏我們鎖定了客戶類的對象 ------------------------------- ------- ...

我的疑惑:

  1. 我們爲什麼要鎖定在比第2部分的表類其他表類的對象?

  2. 如果我們沒有得到卡斯特部分2鎖定那麼我們就可以使用表 類如果我們鎖定卡斯特那麼我們還需要表類的對象來訪問synchronized塊訪問synchronized塊。 表類的對象只需要訪問同步塊。 由於同步,我們阻止表類的對象同時訪問來自不同線程的同步塊
    。 那麼爲什麼我們應該在table類中鎖定table類以外的對象呢?

  3. 客戶類的對象是否會嘗試同時訪問同步塊
    不同的地方?

  4. 在part2中,我們鎖定了除表類以外的對象。 在什麼情況下,在表類以外的類的對象上獲取鎖定是
    在part2中鎖定客戶類對象的好處是什麼?

  5. 什麼是需要鎖定客戶類的對象,即表類除外?

  6. 如果我們沒有在part2中鎖定客戶類的對象會發生什麼樣的損害?

請問,我是新來的Java線程,我一直試圖圍繞這些問題圍繞我的頭一段時間。任何明確的解釋將有助於很多。謝謝

+0

您是否意識到等寬字體很難讀取文本?你介意打破代碼塊中的文字嗎? –

+0

我強烈建議您修改格式。此外,Java同步是一個廣泛討論的主題,所以您應該提到您已經在StackOverflow中查看過的內容。 –

+0

當我搜索「什麼是Java同步做」在谷歌,第一次打是這個SO問題:http://stackoverflow.com/questions/1085709/what-does-synchronized-mean –

回答

1

您應該檢查的第一件事是: 什麼樣的數據字段將使用「同步」關鍵字保護不同類型。

static變量/方法是類級對象,所有其他變量/方法都是實例級別。

類級鎖是一個鎖,它使得類的所有對象都等待,直到相應的鎖未釋放。

例如

Class A{ 
static synchronized void foo(){} 
} 

在這裏,方法foo是同步的,因此所有的類的所有對象線程將等待,直到對象當前正在運行的方法foo的完成其執行。

同樣,一個實例級別鎖使所有使用類實例啓動的線程等待,直到鎖未釋放。

例如

Class A{ 
synchronized void bar(){} 
} 

這裏所有從當前正在執行bar方法的對象開始的線程將一直等到當前線程完成其執行。請注意,其他對象的其他線程可以執行bar方法,而另一個對象的線程正在執行bar方法。

換句話說,一個線程不能進入同步的代碼塊,直到它保留 適當的對象鎖。

對於instance methods,這是一個實例的鎖定。

對於static methods這是Class對象鎖。

0

看來你分析了一些現有的代碼,並試圖理解爲什麼有同步。

part1和part2代碼在同一個函數中嗎?

在第二部分中,同步沒有意義。創建客戶對象然後進行同步不起作用。第二個線程將創建一個新的客戶對象並鎖定該對象。

如果您需要更改現有的代碼,您可以編寫測試用例並跨度可能的線程並刪除同步以查看是否可以強制執行多線程問題。