java—替代事务锁定和处理来自不同用户的并行请求

cczfrluj  于 2021-07-09  发布在  Java
关注(0)|答案(2)|浏览(278)

我有一个条件,其中只允许对实体执行特定数量的create操作。为了避免竞争条件,我使用了事务锁。但同时我想处理来自不同用户的并行请求。在java中,有没有任何方法可以在没有任何竞争条件的情况下处理来自不同用户的并行请求?

7gcisfzg

7gcisfzg1#

我理解你的问题。并行处理本身的风险很小,因为如果生成并行线程,可能会出现争用条件。但话说回来,假设您知道tomcat的sever.xml中给出的servlet可伸缩性(您可以通过改变max threads来增加这个可伸缩性),那么您就可以使用并行处理(通过负载测试知道当前的可伸缩性)智能地生成至少一半的servlet线程容量,所以在这种情况下,在大多数情况下不会有竞争条件。

qni6mghb

qni6mghb2#

听起来你的问题是:
有一个具有“create”操作的api。这将创建单个项,除非不允许。
每个用户都有一个限制;他们不能创建超过5个项目。
你要确保有人同时两次调用“create”api,不会让你偷偷进入一个系统,让一个用户完成6个项目。
你当然可以。
你可以使用两大策略。

有自我保护的收藏

目前尚不清楚这些实体存储在何处或以其他方式进行跟踪。假设createapi只是将一个对象添加到某个地方的arraylist。
然后不要使用arraylist,而是使用有界队列,例如blockingqueue。
但是,也许正在发生的事情不是一件可以像这样轻易修改的事情。

按用户锁定

为系统中的每个用户存储一个锁;这可以是一个动态系统,锁定对象本身在到达0时就会消失。
比如:

class LockStore {
    private final Map<Long, Lock> map = new ConcurrentHashMap<Long, Lock>();

    public Lock getLock(long userId) {
        return map.computeIfAbsent(userId, userId -> new ReentrantLock());
    }
}

如果系统中的用户数可能过大,则需要将其变得更复杂,锁计数降至0的锁最终会从Map中删除。这种删除本身需要聪明地使用并发方法,以确保它本身不会导致竞争条件。

相关问题