2012-07-07 92 views
0

我想更好地理解线程进入synchronized(this)区块和synchronized(someObjectReference)区块时实际发生的机制。同步(this)和同步(objectReference)之间的区别

synchronized (this) { 
     // Statement 1 
     // Statement 2 
    } 

    synchronized (someObjectReference) { 
     // Statement 1 
     // Statement 2 
    } 

我的理解是:(?我失去的东西我错了)

  • 在这两种情况下,只有1线程可以访问在时间
  • 当我们synchronized块“再同步上someObjectReference
    • 只有1个线程每次可以访问/修改它在此块
    • 只有1个线程在同一时间可以进入这块

什么其他的机制是有吗?

synchronized (objectReference) { 
     // Statement 1 dealing with someObjectReference 
     // Statement 2 not dealing with someObjectReference 
    } 

在上面的例子中,它使任何意义添加不处理mutex入同步块语句?

回答

1

这里只有当你将两者混合在一起的差异。

synchronized(foo)的单个基本规则是在任何给定时间只有一个线程可以在synchronized(foo)块中用于相同的foo。那是吧。(唯一需要注意的也许值得一提的是,一个螺纹可以内部几个嵌套synchronized(foo)块用于相同foo。)

如果某些代码是一个synchronized(foo)块内,有的代码是synchronized(bar)块内,则这些片的代码可以同时运行 - 但是不能同时在synchronized(foo)块中有两个线程运行代码。

+0

不错,很清楚。谢谢 – JAM 2012-07-07 18:29:31

0

同步基本上意味着程序请求对指定的对象进行锁定...如果一个线程无法输入任何同步块,那意味着任何其他线程已经锁定了指定的对象..BLOCK代码指定该区域中的一个线程可以进入锁定是否成功获取..

In both cases, only 1 thread can access synchronized block at a time 

--depend的对象被锁定房源

0

在这两种情况下,只有1线程可以访问在时间

不是真的synchronized块。例如,当在“this”上同步时,如果两个线程有​​同一个类的两个不同实例,则可以访问同一个块。但是,有一个例子,只有一个访问块。并且,对于此同步块上的任何同步块也只有一个访问权限。“同步”表示只有一个线程可以访问同一实例上的任何同步块。因此,如果在2个不同的源文件中有2个同步块,但在同一个实例中,如果一个线程位于其中一个块内,另一个线程无法访问同步块

关于“在同步块内执行什么操作“:只做处理同步对象的事情。任何其他不需要同步的指令都会将资源锁定为空,可能会造成瓶颈

+0

是的:)我得说得更清楚了,当然,我正在谈论这个班级的单一实例。点好了 – JAM 2012-07-07 18:27:30

0

需要注意的有关同步this的一个重要事项涉及可见性。假设你有一个类A,它在this上同步。任何使用A的代码都会引用对象A正在使用的锁定。这意味着A的用户如果还锁定了A实例,则可能会创建死锁。

public class A implements Runnable { 
    public void run() { 
    synchronized (this) { 
     // something that blocks waiting for a signal 
    } 
    //other code 
    } 
} 

public class DeadLock { 
    public void deadLock() { 
    A a = new A(); 
    Thread t = new Thread(a); 
    t.start(); 

    Thread.sleep(5000); //make sure other thread starts and enters synchronized block 
    synchronized (a) { 
     // THIS CODE BLOCK NEVER EXECUTES 
     // signal a 
    } 
    } 
} 

如果你总是在一个私有成员变量上同步,你就知道你是唯一一个将该引用用作锁的人。