锁定老帖子 主题:一直不太明白“线程安全”的意思
精华帖 (0) :: 良好帖 (0) :: 新手帖 (0) :: 隐藏帖 (0)
|
|
---|---|
作者 | 正文 |
发表时间:2006-12-22
线程安全是指多个线程访问的共享资源有某种保护,不会因为不同线程的访问修改而出现不一致或是出错的情况么?大家说说你们的理解吧。 声明:ITeye文章版权属于作者,受法律保护。没有作者书面许可不得转载。
推荐链接
|
|
返回顶楼 | |
发表时间:2006-12-22
最基本的就是 没有 全局变量 可以支持多线程
没什么 某种保护 |
|
返回顶楼 | |
发表时间:2006-12-22
你和小秘在屋里亲热,屋子没上锁,老婆冲进屋,这是线程不安全。
这里你和小秘在屋里亲热是一个线程,老婆冲进屋是一个线程。屋子是资源。 你和小秘在屋里亲热,屋子上锁,老婆冲不进屋,这是线程安全 因为资源上锁后你老婆被阻塞了。 |
|
返回顶楼 | |
发表时间:2006-12-22
太广了一些吧
不能是不让进屋子 让他进屋子但是不影响我和我小秘不就可以了么 不让进屋子 难道要排队? 性能上.............. |
|
返回顶楼 | |
发表时间:2006-12-22
如果屋子是资源应该是要排队的吧...
老婆进屋子怎么可能没有影响?那也太明目张胆了吧:) |
|
返回顶楼 | |
发表时间:2006-12-22
恩 .......
可能是概念的问题 有 线程安全 问题的 是 在屋子里XX的 没有问题的 是在屋子里讨论工作的 还有是 直接给你个屋子专门让你工作不能XX 或者 提供给你一个空屋子 XX还是工作随便你 就比如上面那个“由于HibernateTemplate类是线程安全的,我们可以让多个DAO对象共享这个模板类” 这个就直接是 工作屋子 所以没有线程安全问题 还有另一种是struts的action 他就是直接提供了一个屋子 让你自己来决定你是要XX还是要工作 那安全不安全就要自己来定了 |
|
返回顶楼 | |
发表时间: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就算是线程安全的,即每个线程单独使用一个对象. 这种方式也可以作为一种缓存策略, 在安全检查策略中也经常通过这种方式传参. |
|
返回顶楼 | |
发表时间: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就不是公共资源。 |
|
返回顶楼 | |
发表时间:2006-12-25
谢谢各位,我知道线程安全的含义了。不过struts的action是线程不安全的,为什么会这样呢?明白的详细说说呗
|
|
返回顶楼 | |
发表时间:2006-12-25
struts的action和servlet是一样的 只有一个实例 所以全局变量会有问题 这个好像是对他批评比例最高的一个地方了 所以后来才有人想了办法 用Spring包装一下 把action包成bean 每次都用一个新的bean 类似WW那样 每次点击都是新的action
如果你能控制住 不用全局 一般是不会有问题的 具体安全不安全 还是要看code是怎么写的 这个只是有可能会出问题而已 |
|
返回顶楼 | |