原创

Java 线程组中的锁

温馨提示:
本文最后更新于 2024年04月12日,已超过 48 天没有更新。若文章内的图片失效(无法正常加载),请留言反馈或直接联系我

我有Rest api,可以将请求中的实体保存到数据库中。为了提高速度,这些实体的处理/保存是通过线程池完成的,有多个线程。线程一次处理/保存一个实体,每个实体进行处理事务。

有时,这些实体需要一个公共实体B,该请求中的所有实体都应使用该公共实体B。我想知道这些线程应该如何协调该公共实体B的创建。EntityB保存在数据库中,因此所有线程首先检查是否在数据库中找到它,如果没有,则尝试创建它。

EntityB的创建也是从其他地方调用的,只使用一个线程,所以不需要然后协调。

我认为的解决方案是将所有请求处理线程添加到一个 ThreadGroup,该 ThreadGroup 将具有用于创建 EntityB 的锁。就像是。

import java.util.concurrent.locks.Lock;
import java.util.concurrent.locks.ReentrantLock;

public class RequestProcessingThreadGroup extends ThreadGroup {

    private Lock entityBLock = new ReentrantLock(); 

    public void lockForEntityB() {
        entityBLock.lock();
    }

    public void unlockForEntityB() {
        entityBLock.unlock();
    }
}

然后在entityB检查/创建之前检查当前线程是否是RequestProcessingThreadGroup的一部分,如果是则获取锁并在单独的事务中检查/创建entityB,以便其他线程可以看到它并释放锁。

Thread currentThread = Thread.currentThread();
ThreadGroup currentThreadGroup = currentThread.getThreadGroup();
try {
    if (currentThreadGroup instanceof RequestProcessingThreadGroup){
        ((RequestProcessingThreadGroup)currentThreadGroup).lockForEntityB();
    }
    // try to fetch entityB, if not found then create and save
} finally {
    if (currentThreadGroup instanceof RequestProcessingThreadGroup){
        ((RequestProcessingThreadGroup)currentThreadGroup).unlockForEntityB();
    }
}

但由于遇到问题很困难,而且我没有这方面的考虑经验,我想知道是否有什么是我遗漏或忘记的事情。

正文到此结束
热门推荐
本文目录