servlet 线程不安全,想必大家都知道了,本来想在网上找个例子试验下,结果没找到....还是自己写一个吧。
1.证明servlet线程不安全例子
写一个模拟http访问的 客户端程序,用一个线程池对固定的servlet访问1000次,看servlet的计数器是否等于1000。
servlet 的程序如下所示:
最后运行获得的count的最大的结果是990,不是1000.为什么count的值不等于1000,因为++count不是原子操作,当多个线程对count进行读写操作时,就会出错。(详见java编程实践第二章)
2.servlet线程安全方式
主要有三种方式
1.将 int 类型的count用AtomicInteger代替,count.incrementAndGet()把当前值以原子方式加1:
最后count的结果是1000,证明有效
2.使用synchronized加锁,保证操作的原子性:
最后count的结果是1000,证明有效:
3.使用lock机制,保证原子性。(和第二方式的内部原理相同)
最后count的结果是1000,证明有效
注意访问不同的servlet,要修改相应的访问地址。
不知道到怎么在bolg中加代码,放在百度云盘上了....
源代码下载