MyT*_*tle 0 java multithreading
可能重复:
同步块与同步方法?
从对这个问题的公认答案:在Java关键部分中,应该同步什么? 我了解到
public synchronized void foo() {
    // do something thread-safe
}
和:
public void foo() {
    synchronized (this) {
        // do something thread-safe
    }
}
做完全一样的事情。但是在第一种情况下,我们仅使对象的一种方法同步,而在第二种情况下,使不可访问的Whole对象。那么,为什么这两个代码片段执行相同的操作?
您似乎在混合事物。
首先
public synchronized void method() {
}
从同步角度看,它等效于:
public void method() {
    synchronized (this) {
    }
}
优点/缺点已经提到,各种重复说明提供了更多信息。
其次,
synchronized(someObject) {
    //some instructions
}
意味着同步块中的指令不能由2个线程同时执行,因为它们需要先获取监视器someObject。(假定someObject是不变的最终引用)。
就您而言,someObject恰好是this。
对象中任何未同步的代码仍可以并发执行,即使该监视器处于this运行状态,也因为该线程正在运行同步块,所以该监视器处于打开状态。换句话说,synchronized(this)不“锁定整个对象”。它仅防止2个线程同时执行同步块。
最后,如果您有两个synchronized方法(都this用作锁),则如果一个线程(T1)获得this执行这两个方法之一的锁,则不允许其他线程执行这两个方法中的任何一个,因为它们需要获取thisT1已持有的锁。
这种情况可能会在关键部分中引起争用,在这种情况下,必须使用更细粒度的锁定策略(例如,使用多个锁定)。
| 归档时间: | 
 | 
| 查看次数: | 2046 次 | 
| 最近记录: |