java 中的实例同步

Synchronization on an instance in java

我有一个名为 "Plan" 的对象。有一个名为 "PlanService" 的接口,它提供 API 来调用 "Plan" 上的 CRUD 操作。 PlanServiceImpl 是实际在 Plan 上实现 CRUD 操作的实现者。

现在我想同步 Plan 上的 CRUD 操作,如果 callerA 正在调用 "createPlan",callerB 应该在 callerA 完成创建计划之前等待,然后再调用计划上的任何其他操作。

我看过几个关于此的链接,但不太了解同步机制之间的区别,如此处所述:

http://tutorials.jenkov.com/java-concurrency/synchronized.html

有人可以向我解释一下哪种方法可以达到目的吗?

关键问题在于存在多少个服务实例。如果你的服务是单例的(你的应用程序中只有一个实例)那么你可以这样同步:

public void synchronized createPlan() {

}

因为无论从哪里调用方法,持有锁的对象都是相同的。

如果不是单例,那么您需要一个同步对象:

public void createPlan() {
    synchronized(PlanServiceImpl.class) {

    }
}

这通常是 class 对象,因为在 JVM 中只有一个实例。

我假设您只想在创建计划时停止其他线程,否则允许多线程访问。在我看来,您正在寻找一个 ReadWriteLock,它允许您将某些区域设为 写入 ,因此当其他区域正在 读取时,其他线程无法访问 意味着没有其他线程可以 write.

像这样:

class Plan {

    ReadWriteLock creating = new ReentrantReadWriteLock();

    public void createPlan() {
        // Establish a write lock - no-one else can read or write while I hold this lock.
        creating.writeLock().lock();
        try {
            // Do your creating here.
        } finally {
            creating.writeLock().unlock();
        }
    }

    public void doSomething() {
        // Establish a read lock - no-one else can write while reading in process.
        creating.readLock().lock();
        try {
            // Do your creating here.
        } finally {
            creating.readLock().unlock();
        }
    }

    public void doSomethingElse() {
        // Establish a read lock - other threads can also take a read lock at the same time.
        creating.readLock().lock();
        try {
            // Do your creating here.
        } finally {
            creating.readLock().unlock();
        }
    }
}

这里的方法 doSomethingdoSomethingElse 可以 运行 并行,但它们会阻塞 creatPlan 正在完成。