为什么伪对象作为块级同步的参数传递?

mav*_*rav 2 java multithreading synchronized

在Spring源代码中找到了这段代码.这是将XML文件转换为Bean Tree的第一步.

/** Synchronization monitor for the "refresh" and "destroy" */
    private final Object startupShutdownMonitor = new Object();

public void refresh() throws BeansException, IllegalStateException {
        synchronized (this.startupShutdownMonitor) {
            // Prepare this context for refreshing.
            prepareRefresh();
}
Run Code Online (Sandbox Code Playgroud)

Ara*_*ram 7

这个习惯用于更精细的级别同步.以下是Java教程的摘录.你本可以使用synchronized(this)但是已经锁定了整个对象.

同步语句对于通过细粒度同步提高并发性也很有用.例如,假设类MsLunch有两个从不一起使用的实例字段c1和c2.必须同步这些字段的所有更新,但没有理由阻止c1的更新与c2的更新交错 - 这样做会通过创建不必要的阻塞来减少并发性.我们创建两个对象仅用于提供锁,而不是使用同步方法或以其他方式使用与此关联的锁.

public class MsLunch {
    private long c1 = 0;
    private long c2 = 0;
    private Object lock1 = new Object();
    private Object lock2 = new Object();

    public void inc1() {
        synchronized(lock1) {
            c1++;
        }
    }

    public void inc2() {
        synchronized(lock2) {
            c2++;
        }
    }
}
Run Code Online (Sandbox Code Playgroud)

从Java 5开始,java引入了Lock抽象,提供了更多功能.因此,您可以执行类似下面的操作,而不是synchronized(obj).在这里阅读更多细节

Lock lock = new ReentrantLock();

lock.lock();

c1++;

lock.unlock();
Run Code Online (Sandbox Code Playgroud)

  • 同样对'this`进行同步也不是一个好主意,至少还有一个原因:如果有人对对象有引用,他们可以自己同步,这会导致相当奇怪的行为.使用私有对象也可以避免这个问题. (2认同)