0

由dopost / doget调用的servlet方法中的朋友我有一个代码

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 中同步一些代码
4

3 回答 3

1

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

还有几点:

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

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

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

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

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

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

于 2013-01-09T11:13:05.897 回答
1

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

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

于 2013-01-09T12:47:26.443 回答
0

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

于 2013-01-09T11:42:25.640 回答