论坛首页 Java企业应用论坛

讨论:同步VS线程安全

浏览 11453 次
精华帖 (0) :: 良好帖 (0) :: 新手帖 (1) :: 隐藏帖 (2)
作者 正文
   发表时间:2012-03-09  
RT...
大家讨论一下,同步是否一定保证线程安全?
线程安全的是否一定需要同步?
这两个之间的充分必要性,show下你的观点吧~~~
   发表时间:2012-03-09  
我的个人观点吧,在Java中加锁sychronized并不能保证一定是线程安全的,所以设计模式中出现了double-checked locking模式。
0 请登录后投票
   发表时间:2012-03-09  
feikiss 写道
我的个人观点吧,在Java中加锁sychronized并不能保证一定是线程安全的,所以设计模式中出现了double-checked locking模式。

double-checked locking在java中是没有保证的,因为这个模式不能保证可见性这个要求。
加锁保证了排他性和可见性,一定保证线程安全的。
线程安全不一定要加锁,比如用volatile或CAS,concurrent中的类就没有加锁。
0 请登录后投票
   发表时间:2012-03-09   最后修改:2012-03-09
我认为线程安全不一定需要同步,举几个例子
(1)一个无状态(stateless)的类一定是线程安全的,不需要额外的同步;
(2)一个不可变(immutable)的类一定是线程安全的,不需要额外的同步。
(3)使用CAS原语亦能实现线程安全而不不需要使用sychronized。

以上是我个人理解,进攻参考。
1 请登录后投票
   发表时间: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等。
1 请登录后投票
   发表时间:2012-03-09  
跳出这个问题,或许可以参考一下Erlang和或者Scala的Actor利用多核优势的方法。现在已经不鼓励在业务层直接操作线程了。
2 请登录后投票
   发表时间:2012-03-09  
你确定使用多线程编程JVM不会帮你转化为使用多核吗?
0 请登录后投票
   发表时间:2012-03-09  
转化是否用多核是由操作系统来决定的,与应用本身无关。
0 请登录后投票
   发表时间:2012-03-09  
learnworld 写道
建议先理解清楚线程安全和同步含义,再讨论这个充分必要条件。

同步的目标是,在有条件的线程安全或非线程安全环境中,提供一种线程安全机制。

正解。

0 请登录后投票
   发表时间:2012-03-09  
feikiss 写道
我的个人观点吧,在Java中加锁sychronized并不能保证一定是线程安全的,所以设计模式中出现了double-checked locking模式。


double check 是为了 避免无用同步的,将锁最小化

一般在单例中lazy模式时使用。

第一次获取要加锁创建实例

创建好后无需加锁访问。
0 请登录后投票
论坛首页 Java企业应用版

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