锁定老帖子 主题:讨论:同步VS线程安全
精华帖 (0) :: 良好帖 (0) :: 新手帖 (1) :: 隐藏帖 (2)
|
|
---|---|
作者 | 正文 |
发表时间:2012-03-09
feikiss 写道 我的个人观点吧,在Java中加锁sychronized并不能保证一定是线程安全的,所以设计模式中出现了double-checked locking模式。
在Java中加锁sychronized并不能保证一定是线程安全的 那JAVA加这个东西有什么用?好好理解JAVA的锁机制和volatile关键字的含义。 |
|
返回顶楼 | |
发表时间:2012-03-09
feikiss 写道 RT...
大家讨论一下,同步是否一定保证线程安全? 线程安全的是否一定需要同步? 这两个之间的充分必要性,show下你的观点吧~~~ 个人觉得没必要陷入到这样的理论中去。能用代码解决并发即可吧。 |
|
返回顶楼 | |
发表时间:2012-03-09
同步只是实现线程安全的一种手段
现在有很多非阻塞算法可以替代同步 可以看看我的博客 |
|
返回顶楼 | |
发表时间:2012-03-09
picasso.di 写道 我认为线程安全不一定需要同步,举几个例子
(1)一个无状态(stateless)的类一定是线程安全的,不需要额外的同步; (2)一个不可变(immutable)的类一定是线程安全的,不需要额外的同步。 (3)使用CAS原语亦能实现线程安全而不不需要使用sychronized。 以上是我个人理解,进攻参考。 CAS 在大并发下, 不能完全保证线程安全吧 |
|
返回顶楼 | |
发表时间:2012-03-09
tenderuser 写道 picasso.di 写道 我认为线程安全不一定需要同步,举几个例子
(1)一个无状态(stateless)的类一定是线程安全的,不需要额外的同步; (2)一个不可变(immutable)的类一定是线程安全的,不需要额外的同步。 (3)使用CAS原语亦能实现线程安全而不不需要使用sychronized。 以上是我个人理解,进攻参考。 CAS 在大并发下, 不能完全保证线程安全吧 可以保证线程安全,但性能会很差。 |
|
返回顶楼 | |
发表时间:2012-03-09
lyb520320 写道 feikiss 写道 我的个人观点吧,在Java中加锁sychronized并不能保证一定是线程安全的,所以设计模式中出现了double-checked locking模式。
在Java中加锁sychronized并不能保证一定是线程安全的 那JAVA加这个东西有什么用?好好理解JAVA的锁机制和volatile关键字的含义。 实际上double-checked locking 的出现不适sychronized的问题。。。 |
|
返回顶楼 | |
发表时间:2012-03-09
lyb520320 写道 feikiss 写道 我的个人观点吧,在Java中加锁sychronized并不能保证一定是线程安全的,所以设计模式中出现了double-checked locking模式。
在Java中加锁sychronized并不能保证一定是线程安全的 那JAVA加这个东西有什么用?好好理解JAVA的锁机制和volatile关键字的含义。 这本身就是一个抛砖引玉的题目,那就说一下你的理解吧~~ |
|
返回顶楼 | |
发表时间:2012-03-10
最后修改:2012-03-10
feikiss 写道 我的个人观点吧,在Java中加锁sychronized并不能保证一定是线程安全的,所以设计模式中出现了double-checked locking模式。
double checked locking并不是为了线程安全诞生的,而是为了性能优化,防止每次都会进入同步块增加竞争 synchronized块内的代码都不会被reorder,不论是编译器还是cpu。volatile只保证变量的读写不被reorder(读写屏障)。 |
|
返回顶楼 | |
发表时间:2012-03-10
jinnianshilongnian 写道 feikiss 写道 我的个人观点吧,在Java中加锁sychronized并不能保证一定是线程安全的,所以设计模式中出现了double-checked locking模式。
double check 是为了 避免无用同步的,将锁最小化 一般在单例中lazy模式时使用。 第一次获取要加锁创建实例 创建好后无需加锁访问。 +1http://www.cnblogs.com/flier/archive/2004/07/08/22353.html |
|
返回顶楼 | |
发表时间:2012-03-10
lyb520320 写道 feikiss 写道 我的个人观点吧,在Java中加锁sychronized并不能保证一定是线程安全的,所以设计模式中出现了double-checked locking模式。
在Java中加锁sychronized并不能保证一定是线程安全的 那JAVA加这个东西有什么用?好好理解JAVA的锁机制和volatile关键字的含义。 确实,用了锁并不一定就表示是线程安全的了 譬如一个变量,写的时候用锁了,读的时候没有用锁,依然不是线程安全的 只有充分同步,才能保证线程安全,至于如何做到充分同步,这就是考验程序员对java并发掌握程度的时候了 |
|
返回顶楼 | |