Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/multithreading/4.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java静态同步与阻塞队列实现_Java_Multithreading_Static_Synchronized_Blockingqueue - Fatal编程技术网

Java静态同步与阻塞队列实现

Java静态同步与阻塞队列实现,java,multithreading,static,synchronized,blockingqueue,Java,Multithreading,Static,Synchronized,Blockingqueue,我正在尝试使用servlet(resteasy+Hibernate)实现预约队列。 我的预约管理员如下(当然简化了) 目前这种方法很好用。但是我读过关于阻塞队列实现的文章,这似乎是正确的方法 工作罚款的定义: 如果我不使用synchronized static并一次发送多个请求,则多个约会具有相同的约会编号 但是,如果我使用同步静态,则会以正确的顺序创建约会 我在这里不使用任何线程,但我假设tomcat使用自己的线程来处理来自用户的http请求。 那么这是一个多线程应用程序 在过去的几天里,我一

我正在尝试使用servlet(resteasy+Hibernate)实现预约队列。 我的预约管理员如下(当然简化了)

目前这种方法很好用。但是我读过关于阻塞队列实现的文章,这似乎是正确的方法

工作罚款的定义:
如果我不使用synchronized static并一次发送多个请求,则多个约会具有相同的约会编号
但是,如果我使用同步静态,则会以正确的顺序创建约会

我在这里不使用任何线程,但我假设tomcat使用自己的线程来处理来自用户的http请求。 那么这是一个多线程应用程序

在过去的几天里,我一直在谷歌上搜索它,但我得到的最接近的结果是

我需要澄清的是,
-这是正确的方法吗?
-在我的场景中使用同步静态与阻塞队列实现的优缺点是什么


您认为相关的任何其他输入也都是受欢迎的。谢谢。

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

根据您的需要,我有两种选择

  • 如果约会来自数据库,则让数据库或hibernate处理id生成。这将把多线程问题转移到数据库中,该数据库设计用于处理此类问题
  • 如果约会不是来自数据库,并且您只需要约会对象的唯一标识符,请使用UUID,例如java.lang.UUID.randomUUID()
  • 实际上,只有当您希望将约会的创建移出http请求时,使用队列才有意义。例如,如果您在请求完成后创建约会,如夜间批处理作业或专用工作线程池。但这只有在预约费用昂贵的情况下才有意义


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

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

    根据您的需要,我有两种选择

  • 如果约会来自数据库,则让数据库或hibernate处理id生成。这将把多线程问题转移到数据库中,该数据库设计用于处理此类问题
  • 如果约会不是来自数据库,并且您只需要约会对象的唯一标识符,请使用UUID,例如java.lang.UUID.randomUUID()
  • 实际上,只有当您希望将约会的创建移出http请求时,使用队列才有意义。例如,如果您在请求完成后创建约会,如夜间批处理作业或专用工作线程池。但这只有在预约费用昂贵的情况下才有意义


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

    我认为这无关紧要,因为这两种方法都限制在单个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
    }
    }