问题描述
小弟最近写servlet进行项目开发,最近遇到了几个让我很迷惑的问题,希望大家帮忙!(主要是被多线程和jvm给干扰了!) 项目特点:高并发,服务器端开发模式servlet+dao 首先:我在servlet这块进行了数据的验证,我将验证这块单独写在servlet里面自定义的方法里,然后弄了一个成员变量,比如pid等等,我的疑问是:我这样做对于高并发访问servlet的时候成员变量的值是不是不可靠的,也就是没有同步会互斥?第二个问题是:抒写一个成员变量和方法对于jvm的运行有影响,还是说我直接把这个验证写在post中或者get中更好(主要是验证太多,写在一起以后重写麻烦)第四个:我有点迷糊的就是用户访问一个servelt它是会产生一个新的servlet对象呢?还是以单例的模式只用一个? 二:在dao层中,每个dao都是一个个static方法,然后servlet直接方法,这样做要不要对dao里面的每个方法进行同步。唉,小弟对多线程实在是有点没办法,有什么可以去学习下不 问题补充:servlet不是以单例模式只生成一个吗?怎么会生成一个个对象呢?
解决方案
引用我想说的是,我公司在用dao的时候是每个方法都加了一个static,也就是把dao当成了工具类在使用,所以我在想怎么就没有同步问题呢...servlet这块,我奇怪的是为什么struts2里面成员变量就不怕同步问题呢..servlet就有这问题 struts2的原理其实就是在servlet里面生成多个action,也就是说每次请求都生成一个新action,所以没有线程安全的问题,所以我们把变量现在action里面肯定是没问题的。 而你公司那么用只是说现在的运行环境还没有过同步问题,不代表真的没问题。 至于struts2的原理不懂的可以问我,我最近做了自己的一个mvc,模拟的struts2,可以给你讲讲。
解决方案二:
1,servlet确实线程非安全的,假如你把变量设置成servlet的局部变量,是会有问题的。所以最好在get或者post里面设置变量。2,对于dao这一层,不用每个都加同步,你只需要在方法体内比如 public void save(){ synchronized(this){}}这样加。加的地方越小越好,性能影响的小。3,dao方法设置成static是没有问题的,但是建议不要这么做。假如确实要用成static的或者dao是单例的,那么对于update,save这样的方法体内需要想上面那样加上同步锁。假如是Dao dao=new Dao()这样的,那么就不用加锁,因为每次都会生成一个新的dao,不会有线程问题。希望我的回答对你有帮助,不懂的可以站内问我。
解决方案三:
引用① 我这样做对于高并发访问servlet的时候成员变量的值是不是不可靠的②第四个:我有点迷糊的就是用户访问一个servelt它是会产生一个新的servlet对象呢?还是以单例的模式只用一个? 请参见:http://blog.csdn.net/cyliao/article/details/4098229上面说的很详细,我摘录一段给你看,如下:引用Servlet体系结构是建立在Java多线程机制之上的,它的生命周期是由Web容器负责的。当客户端第一次请求某个Servlet时,Servlet 容器将会根据web.xml配置文件实例化这个Servlet类。当有新的客户端请求该Servlet时,一般不会再实例化该Servlet类,也就是有多个线程在使用这个实例。引用抒写一个成员变量和方法对于jvm的运行有影响,还是说我直接把这个验证写在post中或者get中更好建议你别把验证直接写在 POST 或者 GET 方法中,拆分出来的好, 这样一目了然,容易维护。引用在dao层中,每个dao都是一个个static方法,然后servlet直接方法,这样做要不要对dao里面的每个方法进行同步你需要做的是对那些进行数据库访问的操作一定要进行同步,不然并发量一大,必出问题不可。
解决方案四:
同步一定要在非常必要的地方才使用,不然在工程当中到处同步会严重降低系统的反应的。
解决方案五:
1。用户访问一个servelt是会产生一个新的servlet对象的。2。在dao层中,每个dao都是一个个static方法 那你就需要考虑同步的问题了。不明白你为什么会把里面的方法都写成static的。