【问题标题】:Java CDI @ApplicationScoped sync/async accessJava CDI @ApplicationScoped 同步/异步访问
【发布时间】:2014-10-20 19:49:08
【问题描述】:

我正在寻找一段时间,无法弄清楚 CDI 容器如何处理 @ApplicationScoped bean。我的意思是 - 如果你有 Session 的课程,比如:

@ApplicationScoped
public class Session {

    Map<User,Session> map = new HashMap<>();

    public void add(User user,Session session) {
        sessions.put(user,session);
    }

    public Session getSession(User user) {
        return list.get(user);
    }

}

每次用户登录时都会调用addSession(Session session, User user)方法。假设我们想要不时检索用户的会话——我们可以通过调用getSession(User user)方法来实现。

问题是:

  1. 如果某个呼叫将SessionUser 放到地图上。在第一个推杆呼叫完成之前,是否会暂停其他呼叫? (例如,我们有额外的同时 4 个调用 - 2 个用于 getSession 方法,2 个用于 add 方法)

  2. 如果某个呼叫试图拨打getSession。其他同时通话是否也会暂停,直到完成?

  3. SynchronizedList 和/或AtomicInteger(假设我们有整数列表,因为具体情况只是一个示例)是否改变了某些内容?

这个问题的主题是:@ApplicationScoped 真的可以“冻结”我的应用程序吗?因为我觉得这是一个真正的瓶颈,因为我不能像在 EJB 中那样使用 @ConcurencyManagement 锁。

【问题讨论】:

    标签: jakarta-ee asynchronous concurrency containers cdi


    【解决方案1】:

    可以同时访问 CDI bean 上的方法。没有锁,没有瓶颈,但是您的代码可能会遇到重入问题。

    @ApplicationScoped bean 上的方法必须是无状态的或可以访问线程安全属性:在您的情况下,您应该将 HashMap 更改为 ConcurrentHashMap。

    【讨论】:

    • 是的,我想通了。但我想确认这一点。你没有瓶颈,但还需要处理并发访问。
    猜你喜欢
    • 2012-03-10
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-11-24
    相关资源
    最近更新 更多