2.3 加锁机制

当在Servlet中添加一个状态变量时,可以通过线程安全的对象来管理Servlet的状态以维护Servlet的线程安全性。但如果想在Servlet中添加更多的状态,那么是否只需添加更多的线程安全状态变量就足够了?

假设我们希望提升Servlet的性能:将最近的计算结果缓存起来,当两个连续的请求对相同的数值进行因数分解时,可以直接使用上一次的计算结果,而无须重新计算。(这并非一种有效的缓存策略,5.6节将给出一种更好的策略。)要实现该缓存策略,需要保存两个状态:最近执行因数分解的数值,以及分解结果。

我们曾通过AtomicLong以线程安全的方式来管理计数器的状态,那么,在这里是否可以使用类似的AtomicReference[1]来管理最近执行因数分解的数值及其分解结果吗?在程序清单2-5中的UnsafeCachingFactorizer实现了这种思想。

程序清单2-5 该Servlet在没有足够原子性保证的情况下对其最近计算结果进行缓存(不要这么做)

@NotThreadSafe

public class UnsafeCachingFactorizer implements Servlet{

private final AtomicReference<BigInteger>lastNumber

=new AtomicReference<BigInteger>();

private final AtomicReference<BigInteger[]>lastFactors

=new AtomicReference<BigInteger[]>();

public void service(ServletRequest req, ServletResponse resp){ ...

Get Java并发编程实战 now with the O’Reilly learning platform.

O’Reilly members experience books, live events, courses curated by job role, and more from O’Reilly and nearly 200 top publishers.