论坛首页 Java企业应用论坛

关于synchronized的疑问

浏览 60681 次
该帖已经被评为精华帖
作者 正文
   发表时间:2004-04-19  
呵呵,楼上,的确,凡是存在并发可能的地方都需要加上同步控制,从理论上的确是对的。
   不过我们需要从实际上考虑一些问题。开发人员是否很好掌握了同步与多线程?并且在实际应用过程中出现并发的机率与安全严重性的程度。我只所以说同步是可选择的,不是在理论的层次,而是基于楼主提出问题的实际情况。对于一个不知道什么是同步,同步有哪些优缺点,并且无法给予正确编码和调试、测试,再说,客户的要求可能非常低,在这样的情况下,取舍是有必要的。
   准确地说,存在web操作,就存在并发。但是,在目前很多web程序中并没有使用同步,我们不能说他们就没有一点可取性。
   对于一个懂得多线程的应用,熟悉同步的,当然要在并发可能产生的环境下使用这项技术。不过我的提出并非我无知,而只是在一种特定情况下的取舍。
0 请登录后投票
   发表时间:2004-04-19  
凤舞凰扬 写道
不过我们需要从实际上考虑一些问题。开发人员是否很好掌握了同步与多线程?并且在实际应用过程中出现并发的机率与安全严重性的程度。我只所以说同步是可选择的,不是在理论的层次,而是基于楼主提出问题的实际情况。对于一个不知道什么是同步,同步有哪些优缺点,并且无法给予正确编码和调试、测试,再说,客户的要求可能非常低,在这样的情况下,取舍是有必要的。

任何情况下都没有舍的必要!线程安全的最大可怕之处在于同步问题发生的不可预知性和不可重复性,出现问题后你甚至都不知道错在哪里,从哪里debug。
引用
但是,在目前很多web程序中并没有使用同步,我们不能说他们就没有一点可取性。

目前很多web程序中并没有使用同步是因为不存在线程同步问题不需要同步。
0 请登录后投票
   发表时间:2004-04-19  
:lol: ,我理解楼上的用心,的确我们是需要倡导一种好的编程方式,尽量不要有严重的逻辑或者安全隐患。
    不过,我可以告诉你,很多web程序没有用到同步,尤其是在struts出来之前,不是说web程序不需要考虑多线程(没有的事,有web就有并发,除非哪个程序员没有写过一些静态方法或者共享过一些特殊的静态变量),而是很多人根本就不清楚怎么用,并且运行了很多次都没有发现问题。不信你自己可以试一试,一般说来,只要你的业务逻辑不是很长,那么你在20个左右的用户的同时访问都基本上是出不了问题的,根据我的经验,一般说来,这样的程序在30~50个左右用户的同时访问时就会出现问题了(还是采用机器测试,如果是人进行测试,那么结果可以更高),这也就是很多web程序做出来,去用loadrunner做性能测试的时候,50个用户并发量很多都难以通过的原因(当然,也跟程序、机器等方面有关系),不是说性能差,而是出错了,出错就出在这个地方。
    这也是我说的为什么要区别对待的。如果你做一个20~30人同时访问的小型论坛等,根本不需要花太多心考虑同步的问题。
    好了,我希望楼上能懂我的意思,和你的初衷也是一样的。只是看待问题的方式不同罢了。
0 请登录后投票
   发表时间:2004-04-19  
struts就没有同步问题了?struts是多个线程共用一个action实例的,所以action类最好不要存在实例变量,如果有也得是不可变类。至于类变量及实例变量得线程安全问题更应该是设计此类的人员应该明确的,这和并发人数没有关系,处处留意线程安全,即使是1000个并发也不会出现问题。
0 请登录后投票
   发表时间:2004-04-20  
没有太懂楼上的话,在struts中,action的调用在ActionServlet已经进行了同步处理,它当然没有同步问题。至于你说action中不能有实例变量,我更是不太懂了?因为即使是没有进行同步处理,一样可以拥有实例变量啊?在方法中定义实例变量属于一种弱引用,和同不同步没有关系的。
   至于说设计人员应该明确线程安全问题,这个的确。不过楼上我冒昧地问一句,你设计的web程序支持自动测试机通过1000的并发数量么?(当然性能也是考虑的一个主要问题)说实话,我基本上没有看到谁设计出过这样的web程序(不是说没有人能,高手还是有的,不过我不在其中, ),另外我基本上可以保证,90%左右的设计人员(在中国一般就工作了两三年就嚷着要做设计员、分析员)都做不好线程的同步设计,我看到的无非有两种:一种就是被滥用,什么鬼地方都用,因为设计人员不知道是否该用;二就是取舍,基本上不用。这些我们就要区别对待了。
0 请登录后投票
   发表时间:2004-04-20  
楼上讲的实例变量应该是类的属性,也就是强引用吧,requestprocessor那里已经加了同步关键字,应该是安全的。如果不使用同步,大家说有没有其他方案,如果用实例池,一个项目一百几十个action,每个action弄个十个八个实例在池中(经常用的action可以多放几个,这是策略问题了),占用资源也挺多的。每次调用action都new 一个,不用说,创建对象很消耗资源。我想struts的开发者也应该考虑过各个方案,采用同步有一定道理。
0 请登录后投票
   发表时间:2004-04-20  
凤舞凰扬 写道
没有太懂楼上的话,在struts中,action的调用在ActionServlet已经进行了同步处理,它当然没有同步问题。至于你说action中不能有实例变量,我更是不太懂了?因为即使是没有进行同步处理,一样可以拥有实例变量啊?在方法中定义实例变量属于一种弱引用,和同不同步没有关系的。
   至于说设计人员应该明确线程安全问题,这个的确。不过楼上我冒昧地问一句,你设计的web程序支持自动测试机通过1000的并发数量么?(当然性能也是考虑的一个主要问题)说实话,我基本上没有看到谁设计出过这样的web程序(不是说没有人能,高手还是有的,不过我不在其中, ),另外我基本上可以保证,90%左右的设计人员(在中国一般就工作了两三年就嚷着要做设计员、分析员)都做不好线程的同步设计,我看到的无非有两种:一种就是被滥用,什么鬼地方都用,因为设计人员不知道是否该用;二就是取舍,基本上不用。这些我们就要区别对待了。



Struts我没碰过,不说它,就说Servlet。在标准的Web容器中,一个Servlet对象是可以被多个线程同时访问的,所以,作为Servlet类的实例变量,如果不是线程安全的话,那么即使它不是静态变量,那么也存在着线程问题。不知道我这样解释清楚了没有?

也就是说,在一个Servlet类中,例如:

public class ControllerA extends HttpServlet {
    public A a = new A();
   
    public function1(){
        B b = new B();
    }
}


A如果不是线程安全类的话,那么这个Servlet运行起来就存在着多线程冲突的危险。即使我们不是定义 A 为static。

我猜Strut里面的action可能也是servlet吧,那么就一样了。

这个问题其实很基本的,如果对java研究扎实点都会知道,我也忘了那里第一次看的,后来在别的论坛也看到类似问题。

凤舞凰扬说的或者是实话,但是绝对不对。我们如果写程序的时候就抱着我这个程序是写给几十个人用的,性能和安全不太好,我想,这样的程序员不是好程序员,这样的经理不是好经理,这样的公司不是好公司。我们中国的软件水平也不可能上去的。知道多少,就做多少,问心无愧,这是最基本的,不知者无罪,知者不行有罪。
0 请登录后投票
   发表时间:2004-04-20  
我也觉得跟人数访问不相关的,问题是你的servlet要么设计为mt,要么是 st.前者你的servlet从不声明实例变量,类变量就只能是只读或常数数据,确保线程安全.就算2 个用户访问,你也得要这样考虑.
0 请登录后投票
   发表时间:2004-04-20  
action不是servlet,只是singlton而已,servlet也是单例的,所以存在处理线程同步的问题
0 请登录后投票
   发表时间:2004-04-20  
哈哈,被楼上批驳了一番(其实说的是,做程序本身就应该严格点,呵呵)。
   对于servlet,如果你定义全局变量,当然会出现同步问题的,就如同mikeho所指的强引用对象一样。对于弱引用(并且非共享资源)对象就不会出现上述问题的。
   楼上一点我理解,但是真的可以说,没有多少人可以准确知道什么时候该用同步,什么时候可以不用,包括你和我(也许比起一般人理解得多)。你不能怪大家不研究不钻研,多线程的编程历来是编程的最大难题,这就是EJB为什么诞生的原因之一。你,还有我,也许还有大多数人在简单的应用情况下知道用同步,但是复杂的多线程处理还知道么?
    我上面强调的是因问题而异,对于一个完全不懂多线程,连同步的基本概念都不懂的,我们去大谈同步如何如何,对于他是没有任何实际意义的。这就如同对一个刚刚会编程的人去谈他的类设计如何如何拙劣一样,没有任何帮助的。
    同步不是就写一个synchonized那么简单的,它会带来我们更深层次的思考,具体该什么时候用它,而什么时候不该用它。
    不过,最后,我还是很佩服楼上,有机会也希望能多和你交流,哈哈,能成为同事更好啊~~~~~,中国的软件业的确需要多几个这样认真的人!
0 请登录后投票
论坛首页 Java企业应用版

跳转论坛:
Global site tag (gtag.js) - Google Analytics