模拟Servlet单实例多线程运行service方法
1. 项目目录
2. MyServlet.java(实现servlet接口,service方法内容如下,其余皆是空方法)
package ch9.myservlet;
import java.io.IOException;
import javax.servlet.Servlet;
import javax.servlet.ServletConfig;
import javax.servlet.ServletException;
import javax.servlet.ServletRequest;
import javax.servlet.ServletResponse;
public class MyServlet implements Servlet {
@Override
public void init(ServletConfig config) throws ServletException {
}
/**
* 定义局部变量i,执行i++,线程睡眠两秒后在控制台打印出i的值
*
* 据此来判断多线程执行单实例的方法是否会对局部变量产生影响
*/
@Override
public void service(ServletRequest req, ServletResponse res) throws ServletException, IOException {
int i = 0;
i++;
try {
Thread.sleep(2000);
} catch (InterruptedException e) {
e.printStackTrace();
}
System.out.println(i);
}
@Override
public void destroy() {
}
@Override
public String getServletInfo() {
return null;
}
@Override
public ServletConfig getServletConfig() {
return null;
}
}
3. MyServletSingleton.java(生成MyServlet的单例,并提供公共的get方法)
package ch9.myservlet;
public class MyServletSingleton {
private static MyServlet myServlet = new MyServlet();
public static MyServlet getMyServlet() {
return myServlet;
}
}
4. MyServletContainer.java(main方法,获取MyServlet类的单例,使用匿名内部类创建五个线程来执行该单例的service方法)
package ch9.myservlet;
import java.io.IOException;
import javax.servlet.ServletException;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
public class MyServletContainer {
public static void main(String[] args) {
MyServlet myServlet = MyServletSingleton.getMyServlet();
for (int i = 0; i < 5; i++) {
new Thread() {
private HttpServletRequest req;
private HttpServletResponse res;
public void run() {
try {
myServlet.service(req, res);
} catch (ServletException e) {
e.printStackTrace();
} catch (IOException e) {
e.printStackTrace();
}
}
}.start();;
}
}
}
5. 运行效果
6. 总结
五个线程的输出结果均为“1”,这说明多线程运行同一对象的同一方法时,各个线程时独立的,并不会对其它线程产生影响,也就是说这个时候局部变量是线程安全的。
关于内部原理的说明,请看此篇博客http://blog.csdn.net/zhujianli1314/article/details/62223841