gpt4 book ai didi

java - 用户并发编辑对象的并发问题

转载 作者:行者123 更新时间:2023-12-03 12:44:47 27 4
gpt4 key购买 nike

在我们的 Web 应用程序中,我们有以下通过按钮调用的代码片段:

if (!isResponsibleSet(request))
{
edit(request, [("responsibleUser"):(user)];
}
请求 是我们正在编辑的对象
用户 是即将对请求负责的用户
问题在于,有时只有一个用户同时单击同一个按钮。
不幸的是,在上述情况下会发生以下情况:
  • 用户 1 点击按钮
  • 用户 2 点击按钮
  • if 语句计算 真实 用户 1
  • if 语句计算 真实 用户 2
  • 用户 1 编辑请求并成为责任人
  • 用户 2 编辑请求并成为责任人

  • if 语句计算 真实 用户 2 只是因为编辑需要很长时间,所以尚未在数据库中设置负责用户
    我们需要消除这种可能性,并且只让一个用户对请求负责,不允许其他任何人编辑它(只需在 if block 中添加一个条件)。最好抛出请求当前正在编辑的异常
    如何在代码中实现这种行为?

    最佳答案

    解决此问题的一种方法是使用 java util concurrent lock (也值得一读,Lock interface api docs):

    import java.util.concurrent.locks.ReentrantLock

    def lock = new ReentrantLock()

    lock.lock()
    try {
    if (!isResponsibleSet(request)) {
    edit(request, [("responsibleUser"):(user)];
    }
    } finally {
    lock.unlock()
    }

    这确保了一次只有一个线程在 lock / unlock 中。在这种情况下是 try 中的代码块.
    换句话说,无论哪个用户(线程)首先获得锁,都可以运行整个事情并完成。第二个用户(线程)等待直到第一个用户(线程)完成整个 block 。
    如果您想为进入并尝试锁定的第二个线程抛出异常,您可以执行以下操作:
    import java.util.concurrent.locks.ReentrantLock

    def lock = new ReentrantLock()

    if (!lock.tryLock()) {
    throw new RuntimeException("lock is already being held by another thread")
    }
    try {
    if (!isResponsibleSet(request)) {
    edit(request, [("responsibleUser"):(user)];
    } else {
    throw new RuntimeException("request is already owned by another user")
    }
    } finally {
    lock.unlock()
    }


    关于java - 用户并发编辑对象的并发问题,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/64642405/

    27 4 0
    Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
    广告合作:1813099741@qq.com 6ren.com