Servlet线程访问控制

时间:2013-01-09 11:07:45

标签: java multithreading servlets

由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. make request(servlet调用和此servlet的作业正在服务器中创建目录)
  2. 从servlet调用返回后,我正在重命名创建的目录。
  3. 重命名时,另一个线程必须不创建相同的目录并修改目录的内容,因为这样我想在servlet中同步一些代码

3 个答案:

答案 0 :(得分:1)

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

更多要点:

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

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

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

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

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

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

答案 1 :(得分:1)

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

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

答案 2 :(得分:0)

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