2015-06-01 34 views
44

我想知道如果我嘗試通過它同步不同的值,我的同步(「Group_Name」)會被跳過,爲什麼會這樣。同步(「Cache_Group」)部分被跳過,爲什麼會這樣呢?

請考慮以下問題。

我有一個名爲 - 「Group1」的SyncGroup,其中有一個名爲「MBOGroup1」的MBO,其中我擁有屬性「name」,「password」,「codeCheck」。 我獲取數據和屬性提取物作爲「releaseCode」

現在我有另一個名爲SYNCGROUP - 「GroupSub1」中,我有一個MBO名爲「MBOSubGroup1」中,我將屬性「releaseCode」 我得到一些結果。

的條件如下

如果我能多行的「MBOGroup1」,我把一個for循環「GroupSub1」,並通過每個「releaseCode」數據「GroupSub1」和提取結果

大多數情況下,一些releaseCode會被跳過,我得到不正確的「結果」爲「GroupSub1」爲什麼這樣?是由於for循環執行速度超過同步()字或其他像CacheGroup策略一樣OnDemand和時間爲10秒

請幫助。

由於有數據需要放置超過4個for循環,其中我未來的syncGroup結果取決於從前一個取得的結果。

想到的
+5

你能否提供一些產生不正確行爲的示例代碼? – Kai

+2

請提供更多信息或示例代碼以獲取解決方案。 – 7383

+0

對我來說,這看起來不像是一個Android問題。這可能是一個MSSQL服務器的問題嗎? –

回答

2
sychronized("Cache_Group") 

第一件事是sychronizing一個字符串是沒用的。

根據給定的引用而不是該值的同步鎖訪問塊。使用「字符串」擊敗了這個目的,因爲字符串是不可變的,並且調用synchronized(「Cache_Group」)兩次將構造2個具有2個不同引用的字符串,允許第二次迭代打破預期的鎖定。

編輯:@see的ReentrantLock更好的訪問控制

1

如果你做這樣的事情:

sychronized("Cache_Group") 

那麼你要syncronize每一次,這意味着您的同步處理資料的不同對象每次創建一個字符串,你需要的是syncronize功能之間的一個變量

例如:

public class test{ 
    final Object lock = new Object; 

    public void apple(){ 
     sychronized(lock){ 
      ... 
     } 
    } 

    public void orange(){ 
     sychronized(lock){ 
      ... 
     } 
    } 
} 

提示:例如上面顯示一個類的內部鎖定,如果要課間鎖定,則您的鎖定對象應該是靜態/這些類或以上的全球,但是從死鎖你自己當心!