gpt4 book ai didi

Java 静态 Synchronized 与 BlockingQueue 实现

转载 作者:太空宇宙 更新时间:2023-11-04 11:21:17 25 4
gpt4 key购买 nike

我正在尝试使用 Servlet(resteasy + Hibernate)实现约会队列。我的预约 Controller 如下(当然是简化的)。

public class AppoController{

public synchronized static int createAppoinment(AppObj app){
//get last app no
//insert new app with no+1
//return new app no
}
}

目前这个方法效果很好。但我读过有关 BlockingQueue 实现的信息,这似乎是正确的方法?

工作良好的定义:
如果我不使用同步静态并一次发送多个请求,则多个约会具有相同的约会否
但如果我使用同步静态,则按正确顺序创建的约会

我在这里不使用任何线程,但我假设 tomcat 使用它自己的线程来服务器来自用户的 http 请求。所以这是一个多线程应用程序?

过去几天我已经用谷歌搜索过它,但我得到的最接近的是Java/Android: Synchronized vs Queue implementation

我需要澄清的是;
- 这是正确的方法吗?
- 对于我的场景,使用同步静态与 BlockingQueue 实现的优点和缺点是什么。

也欢迎您提出任何其他相关的意见。谢谢。

最佳答案

您的实现确实有效。同步方法在任何时刻只能由一个线程执行。 Tomcat 将使用多个线程(详细信息取决于当前设置,假设每个请求一个线程),因此每个并发请求将获得自己的线程,然后每个请求都会等待此方法,直到允许其线程进入该方法。

根据您的需求,我看到两个选项。

  1. 如果约会来自数据库,则让数据库或 hibernate 处理 ID 生成。这会将多线程问题转移到旨在处理此类问题的数据库中。
  2. 如果约会不是来自数据库,并且您只需要约会对象的唯一标识符,请使用 UUID,例如java.lang.UUID.randomUUID()

实际上,仅当您想要将约会的创建移出 http 请求时,使用队列才有意义。例如。如果您在请求完成后创建约会,例如夜间批处理作业或专用工作线程池。但只有当创建约会的操作成本昂贵时,这才有意义。

在不同的主题上,您应该检查此方法是否需要是静态的。

关于Java 静态 Synchronized 与 BlockingQueue 实现,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/44868139/

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