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();
}
}
但由于遇到问题很困难,而且我没有这方面的考虑经验,我想知道是否有什么是我遗漏或忘记的事情。
正文到此结束
- 本文标签: 家庭宠物
- 本文链接: https://www.coder6.net/article/2323
- 版权声明: 本文由蚂蚁原创发布,转载请遵循《署名-非商业性使用-相同方式共享 4.0 国际 (CC BY-NC-SA 4.0)》许可协议授权
热门推荐
-
浏览(193) 评论(0)