Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/c/72.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 Tomcat中的Servlet并发/同步?_Java_Servlets_Concurrency - Fatal编程技术网

Java Tomcat中的Servlet并发/同步?

Java Tomcat中的Servlet并发/同步?,java,servlets,concurrency,Java,Servlets,Concurrency,是否有一种推荐的方法来同步碰巧竞争同一资源的TomcatServlet实例(如文件或非ACID的MongoDB之类的数据库) 我熟悉线程同步,以确保两个Java线程不会同时访问同一个Java对象,但不会访问JRE之外存在的对象 编辑:我只有一台Tomcat服务器在运行。这是否意味着不同的JVM,我不确定(我假设它是相同的JVM,但可能是不同的线程) 编辑:特定用例(但我一般都会问这个问题): Tomcat服务器充当文件存储,将原始文件放入目录,并使用MongoDB存储元数据。除了并发性问题之外

是否有一种推荐的方法来同步碰巧竞争同一资源的TomcatServlet实例(如文件或非ACID的MongoDB之类的数据库)

我熟悉线程同步,以确保两个Java线程不会同时访问同一个Java对象,但不会访问JRE之外存在的对象

编辑:我只有一台Tomcat服务器在运行。这是否意味着不同的JVM,我不确定(我假设它是相同的JVM,但可能是不同的线程)


编辑:特定用例(但我一般都会问这个问题):


Tomcat服务器充当文件存储,将原始文件放入目录,并使用MongoDB存储元数据。除了并发性问题之外,这是一个非常简单的概念。如果有两个并发请求存储同一个文件,或者同时管理同一对象上的元数据,我需要一种方法来解决这个问题,但我不确定如何解决。我认为最简单的方法是以某种方式序列化/排队请求。有没有办法在Tomcat中实现排队?

您的外部资源将以某种方式由Java对象(例如Java.io.File)表示。如果需要,可以始终在该对象上同步


当然,这意味着所述对象必须在servlet实例之间共享。

通常,您的各种servlet将在同一JVM中运行,如果它们不是,您应该能够配置servlet运行程序,因此情况就是这样。因此,您可以安排他们查看一些中央共享资源管理器


然后,对于实际的gubbinry,如果普通的old synchronized不合适,请查看该类的示例(链接是我不久前编写的教程/示例的一部分,以防有用),该类允许您处理资源的“池”。

我想这是自找麻烦。数据库和共享文件系统的发明有其原因。尝试使用一些单例类或信号量来编写自己的代码会很快变得很糟糕。找到一个可以为您做到这一点的存储解决方案,这样可以省去很多麻烦

如果您运行的是一台tomcat服务器,并且所有servlet都在一个上下文上,那么您可以始终在该上下文类加载器上的java对象上进行同步。如果正在运行多个上下文,“同步对象”不能驻留在任何特定上下文中,但需要驻留在所有上下文共享的更高级别上。您可以使用tomcat 6.0文档中的“公共”类加载器将您的“同步对象”放在那里,然后在所有上下文中共享它。

我有两种情况,如果您希望在同一JVM中访问用于文件编辑的公共资源,您可以在Java函数中使用“同步”。如果不同的JVM和其他非Java线程访问公共资源,您可以尝试使用手动文件锁定代码,为队列中的每个线程提供优先级编号


对于数据库,我认为没有并发问题。

这进一步意味着有一些内部软件来控制代理对象的创建,这些代理对象表示有争议的资源。就目前的情况而言,没有什么可以阻止多段代码创建它们自己的文件对象,这些文件对象都表示同一个文件。因此,您必须有某种类型的单例工厂,以确保每个有争议的资源只有一个对象。@chsply76:no-no-no(John说的话)--如果您执行以下代码{File f1=new File(“/usr/bin”);File f2=new File(“/usr/bin”);System.out.println(f1==f2);}则为false,因此,在一个文件上进行同步与在另一个文件上是否可以获得锁无关。@Jason-“所述对象必须共享”的哪一部分意味着可以创建文件的两个副本?它们都将在同一个JVM中运行还是可能在Tomcat的不同实例中运行?“这样您就可以安排他们查看一些中央共享资源管理器”--这意味着我应该创建某种类型的单例?是的,没错--使用静态方法getDatabasePool(),getCacheManager()创建一个单例类如果您要添加这种瓶颈,那么他也可以使用Tomcats SingleThreadedServlet(或类似的东西)策略。我无法评论海报是否计划添加瓶颈,但原则上,在服务器之间共享资源是一件非常有效的事情。我不是想写我自己的,我只是想知道,建议使用单独的、可能并发的Tomcat请求来正确处理写入文件的问题r到MongoDB,我的答案是-不建议这样做。