论坛首页 入门技术论坛

一直不太明白“线程安全”的意思

浏览 8113 次
精华帖 (0) :: 良好帖 (0) :: 新手帖 (0) :: 隐藏帖 (0)
作者 正文
   发表时间:2006-12-22  
spring in action书中说“由于HibernateTemplate类是线程安全的,我们可以让多个DAO对象共享这个模板类”
线程安全是指多个线程访问的共享资源有某种保护,不会因为不同线程的访问修改而出现不一致或是出错的情况么?大家说说你们的理解吧。
   发表时间:2006-12-22  
最基本的就是  没有  全局变量  可以支持多线程
没什么 某种保护
0 请登录后投票
   发表时间:2006-12-22  
你和小秘在屋里亲热,屋子没上锁,老婆冲进屋,这是线程不安全。

这里你和小秘在屋里亲热是一个线程,老婆冲进屋是一个线程。屋子是资源。


你和小秘在屋里亲热,屋子上锁,老婆冲不进屋,这是线程安全
因为资源上锁后你老婆被阻塞了。

1 请登录后投票
   发表时间:2006-12-22  
太广了一些吧
不能是不让进屋子
让他进屋子但是不影响我和我小秘不就可以了么

不让进屋子 难道要排队?  性能上..............
0 请登录后投票
   发表时间:2006-12-22  
如果屋子是资源应该是要排队的吧...
老婆进屋子怎么可能没有影响?那也太明目张胆了吧:)
0 请登录后投票
   发表时间:2006-12-22  
恩 .......
可能是概念的问题
有 线程安全 问题的  是  在屋子里XX的
没有问题的  是在屋子里讨论工作的

还有是 直接给你个屋子专门让你工作不能XX  或者  提供给你一个空屋子 XX还是工作随便你

就比如上面那个“由于HibernateTemplate类是线程安全的,我们可以让多个DAO对象共享这个模板类” 这个就直接是 工作屋子  所以没有线程安全问题


还有另一种是struts的action
他就是直接提供了一个屋子  让你自己来决定你是要XX还是要工作   那安全不安全就要自己来定了
0 请登录后投票
   发表时间:2006-12-22  
还是给你一个最简单的线程安全实现来说明吧:
private static final ThreadLocal localContext = new ThreadLocal();
public static MyClass getCurrentThreadMyClass() {
    MyClass myClass = (MyClass) localContext.get();
    if (myClass == null) {
        myClass = new MyClass();
        localContext.set(myClass );
    }
    return myClass;
}

这样,myClass就算是线程安全的,即每个线程单独使用一个对象.
这种方式也可以作为一种缓存策略,
在安全检查策略中也经常通过这种方式传参.
0 请登录后投票
   发表时间:2006-12-24  
线程安全的重要思想就是,多线程并发不出问题。
什么时候多线程并发会出问题,存在临界资源,也就是有状态的公共资源。如果这些公共资源的访问是线程互斥的,就是线程安全的,如果不是,就是线程不安全的。
例如:

Class A{

int temp;
public void setTemp(int i){
    temp =i;
}
public int getTemp(){
return temp;
}


temp还不算是类A的实例的有状态的公共资源,什么情况下是呢?如果多个线程访问一个类A的实例,所有类A内的存取temp的方法必须是synchronized才是线程安全的。
反之,如果每个线程都有一个类A的实例,temp就不是公共资源。
0 请登录后投票
   发表时间:2006-12-25  
谢谢各位,我知道线程安全的含义了。不过struts的action是线程不安全的,为什么会这样呢?明白的详细说说呗
0 请登录后投票
   发表时间:2006-12-25  
struts的action和servlet是一样的  只有一个实例  所以全局变量会有问题  这个好像是对他批评比例最高的一个地方了  所以后来才有人想了办法 用Spring包装一下 把action包成bean 每次都用一个新的bean   类似WW那样 每次点击都是新的action

如果你能控制住  不用全局 一般是不会有问题的  具体安全不安全 还是要看code是怎么写的   这个只是有可能会出问题而已
0 请登录后投票
论坛首页 入门技术版

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