2015-06-01 37 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){ 
      ... 
     } 
    } 
} 

提示:例如上面显示一个类的内部锁定,如果要课间锁定,则您的锁定对象应该是静态/这些类或以上的全球,但是从死锁你自己当心!