关于servlet难理解的问题

 小弟最近写servlet进行项目开发,最近遇到了几个让我很迷惑的问题,希望大家帮忙!(主要是被多线程和jvm给干扰了!)
 项目特点:高并发,服务器端开发模式servlet+dao
 首先:我在servlet这块进行了数据的验证,我将验证这块单独写在servlet里面自定义的方法里,然后弄了一个成员变量,比如pid等等,我的疑问是:我这样做对于高并发访问servlet的时候成员变量的值是不是不可靠的,也就是没有同步会互斥?第二个问题是:抒写一个成员变量和方法对于jvm的运行有影响,还是说我直接把这个验证写在post中或者get中更好(主要是验证太多,写在一起以后重写麻烦)第四个:我有点迷糊的就是用户访问一个servelt它是会产生一个新的servlet对象呢?还是以单例的模式只用一个?
 二:在dao层中,每个dao都是一个个static方法,然后servlet直接方法,这样做要不要对dao里面的每个方法进行同步。唉,小弟对多线程实在是有点没办法,有什么可以去学习下不

[quote]我想说的是,我公司在用dao的时候是每个方法都加了一个static,也就是把dao当成了工具类在使用,所以我在想怎么就没有同步问题呢...servlet这块,我奇怪的是为什么struts2里面成员变量就不怕同步问题呢..servlet就有这问题 [/quote]
struts2的原理其实就是在servlet里面生成多个action,也就是说每次请求都生成一个新action,所以没有线程安全的问题,所以我们把变量现在action里面肯定是没问题的。
而你公司那么用只是说现在的运行环境还没有过同步问题,不代表真的没问题。
至于struts2的原理不懂的可以问我,我最近做了自己的一个mvc,模拟的struts2,可以给你讲讲。

1。用户访问一个servelt是会产生一个新的servlet对象的。
2。在dao层中,每个dao都是一个个static方法 那你就需要考虑同步的问题了。不明白你为什么会把里面的方法都写成static的。

同步一定要在非常必要的地方才使用,不然在工程当中到处同步会严重降低系统的反应的。

[quote]① 我这样做对于高并发访问servlet的时候成员变量的值是不是不可靠的
②第四个:我有点迷糊的就是用户访问一个servelt它是会产生一个新的servlet对象呢?还是以单例的模式只用一个? [/quote]
请参见:[url]http://blog.csdn.net/cyliao/article/details/4098229[/url]上面说的很详细,我摘录一段给你看,如下:
[quote]
Servlet体系结构是建立在Java多线程机制之上的,它的生命周期是由Web容器负责的。当客户端第一次请求某个Servlet时,Servlet 容器将会根据web.xml配置文件实例化这个Servlet类。当有新的客户端请求该Servlet时,一般不会再实例化该Servlet类,也就是有多个线程在使用这个实例。
[/quote]

[quote]抒写一个成员变量和方法对于jvm的运行有影响,还是说我直接把这个验证写在post中或者get中更好[/quote]
建议你别把验证直接写在 POST 或者 GET 方法中,拆分出来的好, 这样一目了然,容易维护。

[quote]在dao层中,每个dao都是一个个static方法,然后servlet直接方法,这样做要不要对dao里面的每个方法进行同步[/quote]你需要做的是对那些进行数据库访问的操作一定要进行同步,不然并发量一大,必出问题不可。

1,servlet确实线程非安全的,假如你把变量设置成servlet的局部变量,是会有问题的。所以最好在get或者post里面设置变量。
2,对于dao这一层,不用每个都加同步,你只需要在方法体内比如
[code="java"]public void save(){
synchronized(this){
}[/code]
}这样加。加的地方越小越好,性能影响的小。
3,dao方法设置成static是没有问题的,但是建议不要这么做。假如确实要用成static的或者dao是单例的,那么对于update,save这样的方法体内需要想上面那样加上同步锁。假如是Dao dao=new Dao()这样的,那么就不用加锁,因为每次都会生成一个新的dao,不会有线程问题。

希望我的回答对你有帮助,不懂的可以站内问我。