java并发编程实践 4.1 设计线程安全的类

缘起

《java并发编程实践》 4.1节

分析

本小节比较抽象和官方. 所以只讲解一下4.1节最后一个例子

servlet框架中的ServletContext为例,ServletContext为Servlet提供了类似于Map的对象容器服务,Servlet可以通过名称,使用setAttribute和getAttribute在ServletContext中注册和获取应用程序对象. 由于Servlet容器实现的ServletContext对象一定会被多线程访问,因此ServletContext必须要是线程安全的. 但是Servlet中调用getAttribute是不必同步的. 即像下面这个样子

1
2
3
4
5
6
7
8
public class MyServlet extends HttpServlet {
protected void service() {
ServletContext.setAttribute();
ServletContext.getAttribute();
}
}
MyServlet实例在Tomcat中仅有一个.
服务线程A和B都使用MyServlet这个唯一的实例进行干活的话, 则MyServlet中不需要做显式的同步. 真正的同步都在ServletContext中,即ServletContext本身是线程安全的对象(3.5的最后的"shared thread-safe").