先把原文贴出来
http://blog.csdn.net/lcore/article/details/8974590
自己描述下读后感:
结论:servlet是线程不安全的
问什么咧,先看下定义,什么叫做线程安全?
说白了,就是两个线程同时访问一个方法或变量,如果存在不一样的情况,就说明这个类是线程不安全的。
什么情况会导致线程不安全呢?
一个类的方法只有一个add() a+b;不会导致线程不安全的问题的。因为a和b都是局部变量,它返回的永远是a+b
结论是一个类存在全局变量或者static变量时会有线程安全问题,比如add函数操作影响了全局量c,那么就会导致多个线程返回的值可能不一样的情况
这个值有时准确有时不准确,这更可怕,不容易被发现。
那么回到servlet线程安全问题上来,它线程安全吗,先看他又哪些方法和变量?
HttpSession ServletContext是全局变量,多线程可以同时进行读写
ServletRequest这个是线程安全的变量,只能被一个线程访问,它只在service()方法内有效,
doget dopost是service内调用的方法。
那么怎么控制让servlet线程安全呢?
使用局部变量
如果需要使用全局变量,使用synchronized和lock锁实现同步。
但是同步带来的问题是线程需要等待。
那么需要高并发的情况下如何设计呢?
分布式服务器,使用开源已经实现的nginx实现负载均衡到任务量少的中间件服务器上
使用线程池的概念,请求到达容器后,调用线程池的一个线程去处理请求,线程找到对应的servlet去处理。
servlet使用对象池的概念
数据库层面考虑分表:
一个典型的例子是一个账号量过亿的系统,要设计用户表。
可以用hash算一下用户名的哈希值,用这个值取模去分表