Java静态同步与阻塞队列实现
我正在尝试使用servlet(resteasy+Hibernate)实现预约队列。 我的预约管理员如下(当然简化了) 目前这种方法很好用。但是我读过关于阻塞队列实现的文章,这似乎是正确的方法 工作罚款的定义:Java静态同步与阻塞队列实现,java,multithreading,static,synchronized,blockingqueue,Java,Multithreading,Static,Synchronized,Blockingqueue,我正在尝试使用servlet(resteasy+Hibernate)实现预约队列。 我的预约管理员如下(当然简化了) 目前这种方法很好用。但是我读过关于阻塞队列实现的文章,这似乎是正确的方法 工作罚款的定义: 如果我不使用synchronized static并一次发送多个请求,则多个约会具有相同的约会编号 但是,如果我使用同步静态,则会以正确的顺序创建约会 我在这里不使用任何线程,但我假设tomcat使用自己的线程来处理来自用户的http请求。 那么这是一个多线程应用程序 在过去的几天里,我一
如果我不使用synchronized static并一次发送多个请求,则多个约会具有相同的约会编号
但是,如果我使用同步静态,则会以正确的顺序创建约会
我在这里不使用任何线程,但我假设tomcat使用自己的线程来处理来自用户的http请求。 那么这是一个多线程应用程序 在过去的几天里,我一直在谷歌上搜索它,但我得到的最接近的结果是 我需要澄清的是,
-这是正确的方法吗?
-在我的场景中使用同步静态与阻塞队列实现的优缺点是什么
您认为相关的任何其他输入也都是受欢迎的。谢谢。您的实现确实有效。同步方法在任何时候只能由一个线程执行。Tomcat将使用多个线程(细节取决于当前设置,让我们假设每个请求一个线程),因此每个并发请求将获得自己的线程,然后ever request将在此方法上等待,直到允许其线程进入该方法 根据您的需要,我有两种选择
在另一个主题上,您应该检查此方法是否需要是静态的。您的实现确实有效。同步方法在任何时候只能由一个线程执行。Tomcat将使用多个线程(细节取决于当前设置,让我们假设每个请求一个线程),因此每个并发请求将获得自己的线程,然后ever request将在此方法上等待,直到允许其线程进入该方法 根据您的需要,我有两种选择
在另一个主题上,您应该检查此方法是否需要是静态的。我认为这无关紧要,因为这两种方法都限制在单个JVM中。如果您的服务变得流行,单个tomcat实例将无法处理所有流量。但是,如果您将服务部署到第二个独立的tomcat实例,这两种方法都不能保证唯一的约会号码。因此,解决此问题的正确方法是让数据库生成约会编号。+1,以提高扩展的影响。我完全错过了那部分!只是一个简单的问题,有没有可能在同步静态方法中用完服务器线程,因为它们被阻塞了(等等)?与blockingqueue相反,线程(生产者)永远不会被阻止?是的,有,但它(a)已被弃用,(b)计划删除,(c)绝对是您最不想要的。只需同步您需要同步的内容,或者使用
java.util.concurrent.
@EJP中的内容,感谢您指向java.util.concurrent
。我认为对于我的需求应用程序,DB的任何一代都不能解决这个问题。但很高兴了解并发包的可能性。我认为这并不重要,因为这两种方法都局限于单个JVM。如果您的服务变得流行,单个tomcat实例将无法处理所有流量。但是,如果您将服务部署到第二个独立的tomcat实例,这两种方法都不能保证唯一的约会号码。因此,解决此问题的正确方法是让数据库生成约会编号。+1,以提高扩展的影响。我完全错过了那部分!只是一个简单的问题,有没有可能在同步静态方法中用完服务器线程,因为它们被阻塞了(等等)?与blockingqueue相反,线程(生产者)永远不会被阻止?是的,有,但它(a)已被弃用,(b)计划删除,(c)绝对是您最不想要的。只需同步您需要同步的内容,或者使用java.util.concurrent.
@EJP中的内容,感谢您指向java.util.concurrent
。我认为对于我的需求应用程序,DB的任何一代都不能解决这个问题。但了解并发包的可能性很好。是的,可以使用oninsert触发器从DB生成约会(我没有多少条件来确定新的应用程序号)。应用程序无创建是一个简单的过程,数百名用户试图访问有限的应用程序无插槽。“不会扩展”是一个严重的夸大。任何解决方案都将涉及到
public class AppoController{
public synchronized static int createAppoinment(AppObj app){
//get last app no
//insert new app with no+1
//return new app no
}
}