【问题标题】:A Servlets threads acces controlA Servlets 线程访问控制
【发布时间】:2013-01-09 11:07:45
【问题描述】:

在 servlet 方法中的朋友,该方法由 要么 dopost/doget 我有一个代码作为

synchronized (this) 
{
String filePath="E:\\FSPATH1\\2KL06CS048\\";
System.out.println("Directory Created   ????????????"+new File(filePath).mkdir());
}

那么上述servlet的多个线程是否可以同时进入上述代码块??

但是 Servlet LifeCycle Concept 说只有一个 Servlet 实例,并且对于该 servlet 的每个请求,都会在该实例上创建一个线程。

其实我的要求是

  1. 发出请求(servlet 调用和此 servlet 的工作正在服务器中创建目录)
  2. 从 servlet 调用返回后,我将重命名创建的目录。
  3. 重命名时,另一个线程不能创建相同的目录并修改目录的内容,因为我想在 servlet 中同步一些代码

【问题讨论】:

  • 不管问题/答案如何,servlet 方法中的这个特定代码 sn-p 都是不好的做法。无论你想用这段代码解决什么问题,肯定都需要以不同的方式解决,这样你才能摆脱synchronized (this)

标签: java multithreading servlets


【解决方案1】:

Q. 在由 dopost/doget 调用的 servlet 方法中,我有一个代码:synchronized (this) {}

---> Servlet Container(tomcat) 将为每个请求创建一个线程,因此每次您在doGet() and doPost() 方法中拥有的内容都将是各自线程的本地内容。所以你不需要再次同步this。所以你的想法是完全错误的。

【讨论】:

  • 但是 Servlet LifeCycle Concept 说只有一个 Servlet 实例,并且对于该 servlet 的每个请求,都会在该实例上创建一个线程。实际上我的要求是
  • 是的。在整个生命周期中只创建一个 servlet 实例。创建每个请求的线程。
  • 但是 Servlet LifeCycle Concept 说只有一个 Servlet 实例,并且对于该 servlet 的每个请求,都会在该实例上创建一个线程。实际上我的要求是 1)发出请求(servlet 调用和这个工作servlet 正在服务器中创建目录)2)一旦从 servlet 调用返回,我将重命名创建的目录。3)重命名另一个线程时不能创建相同的目录并修改目录的内容,因此我想同步排序servlet 中的代码。
【解决方案2】:

synchronized 确保只有一个线程可以同时执行封闭的块 时间。

还有几点:

  1. 同步关键字可应用于方法或语句块,并为一次只能由一个线程执行的关键部分提供保护。

  2. synchronized 关键字可防止代码的关键部分一次被多个线程执行。

  3. 当应用于静态方法时,整个类被锁定,而该方法一次由一个线程执行。

  4. 当应用于实例方法时,实例在被一个线程访问时被锁定。

  5. 当应用于对象或数组时,对象或数组被锁定,而相关代码块一次由一个线程执行。

请注意,每个语句都以一次一个线程结束。

【讨论】:

    【解决方案3】:

    是的,您的代码将确保只有一个线程可以进入该块。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2011-01-06
      • 1970-01-01
      • 1970-01-01
      • 2017-12-01
      • 1970-01-01
      • 2017-11-02
      • 1970-01-01
      相关资源
      最近更新 更多