servlet线程不安全的实例已及解决办法

       servlet 线程不安全,想必大家都知道了,本来想在网上找个例子试验下,结果没找到....还是自己写一个吧。

1.证明servlet线程不安全例子

      写一个模拟http访问的 客户端程序,用一个线程池对固定的servlet访问1000次,看servlet的计数器是否等于1000。

servlet线程不安全的实例已及解决办法

 

servlet 的程序如下所示:

servlet线程不安全的实例已及解决办法

最后运行获得的count的最大的结果是990,不是1000.为什么count的值不等于1000,因为++count不是原子操作,当多个线程对count进行读写操作时,就会出错。(详见java编程实践第二章)

2.servlet线程安全方式

主要有三种方式

1.将 int 类型的count用AtomicInteger代替,count.incrementAndGet()把当前值以原子方式加1:

servlet线程不安全的实例已及解决办法

最后count的结果是1000,证明有效

2.使用synchronized加锁,保证操作的原子性:

servlet线程不安全的实例已及解决办法

最后count的结果是1000,证明有效:

3.使用lock机制,保证原子性。(和第二方式的内部原理相同)

servlet线程不安全的实例已及解决办法

最后count的结果是1000,证明有效

注意访问不同的servlet,要修改相应的访问地址。

不知道到怎么在bolg中加代码,放在百度云盘上了....

源代码下载http://pan.baidu.com/share/link?shareid=40296&uk=3357993878

 

转载于:https://my.oschina.net/u/731423/blog/78735