锁定老帖子 主题:讨论:同步VS线程安全
精华帖 (0) :: 良好帖 (0) :: 新手帖 (1) :: 隐藏帖 (2)
|
|
---|---|
作者 | 正文 |
发表时间:2012-03-09
大家讨论一下,同步是否一定保证线程安全? 线程安全的是否一定需要同步? 这两个之间的充分必要性,show下你的观点吧~~~ 声明:ITeye文章版权属于作者,受法律保护。没有作者书面许可不得转载。
推荐链接
|
|
返回顶楼 | |
发表时间:2012-03-09
我的个人观点吧,在Java中加锁sychronized并不能保证一定是线程安全的,所以设计模式中出现了double-checked locking模式。
|
|
返回顶楼 | |
发表时间:2012-03-09
feikiss 写道 我的个人观点吧,在Java中加锁sychronized并不能保证一定是线程安全的,所以设计模式中出现了double-checked locking模式。
double-checked locking在java中是没有保证的,因为这个模式不能保证可见性这个要求。 加锁保证了排他性和可见性,一定保证线程安全的。 线程安全不一定要加锁,比如用volatile或CAS,concurrent中的类就没有加锁。 |
|
返回顶楼 | |
发表时间:2012-03-09
最后修改:2012-03-09
我认为线程安全不一定需要同步,举几个例子
(1)一个无状态(stateless)的类一定是线程安全的,不需要额外的同步; (2)一个不可变(immutable)的类一定是线程安全的,不需要额外的同步。 (3)使用CAS原语亦能实现线程安全而不不需要使用sychronized。 以上是我个人理解,进攻参考。 |
|
返回顶楼 | |
发表时间:2012-03-09
最后修改:2012-03-09
建议先理解清楚线程安全和同步含义,再讨论这个充分必要条件。
下面这段是wikipedia上面对线程安全的定义: Thread safety is a computer programming concept applicable in the context of multi-threaded programs. A piece of code is thread-safe if it only manipulates shared data structures in a manner that guarantees safe execution by multiple threads at the same time. There are various strategies for making thread-safe data structures. 线程安全的核心目标是,在多线程情况下,各线程同时操作共享数据,可以确保正确的执行结果。 线程安全有几个级别: 不可变,无条件的线程安全,有条件的线程安全,非线程安全(线程兼容),线程对立。 同步的目标是,在有条件的线程安全或非线程安全环境中,提供一种线程安全机制。 1. 同步是否一定要保证线程安全? 使用同步,目标就是一定要线程安全,但有时简单使用同步并不能保证线程安全。 2. 线程安全的是否一定需要同步? 不一定,即时在在有条件的线程安全或非线程安全环境中,也有有很多其他解决方式,如CAS,ThreadLocal等。 |
|
返回顶楼 | |
发表时间:2012-03-09
跳出这个问题,或许可以参考一下Erlang和或者Scala的Actor利用多核优势的方法。现在已经不鼓励在业务层直接操作线程了。
|
|
返回顶楼 | |
发表时间:2012-03-09
你确定使用多线程编程JVM不会帮你转化为使用多核吗?
|
|
返回顶楼 | |
发表时间:2012-03-09
转化是否用多核是由操作系统来决定的,与应用本身无关。
|
|
返回顶楼 | |
发表时间:2012-03-09
learnworld 写道 建议先理解清楚线程安全和同步含义,再讨论这个充分必要条件。
同步的目标是,在有条件的线程安全或非线程安全环境中,提供一种线程安全机制。 正解。 |
|
返回顶楼 | |
发表时间:2012-03-09
feikiss 写道 我的个人观点吧,在Java中加锁sychronized并不能保证一定是线程安全的,所以设计模式中出现了double-checked locking模式。
double check 是为了 避免无用同步的,将锁最小化 一般在单例中lazy模式时使用。 第一次获取要加锁创建实例 创建好后无需加锁访问。 |
|
返回顶楼 | |