条件变量:一种同步类型。
by Johnny Deng
|
Posix的条件变量
|
Java等待-通知机制
|
|
wait(),timed_wati(),signal(),broadcast()
|
wait(), wait(long),notify(), nitifyall()
|
|
必须为条件变量关联一个mutex lock
|
方便使用(synchronized与WN结合使用)
|
|
因此更灵活,当在请求相同lock以保护共享数据而需要发送信号给两个不同的通知对象是条件变量更有效率
|
但无法指派任何lock与任何的通知对象
|
J2SE5.0条件变量是绑在Lock上的,如同等待-通知机制和同步Lock一样。
关于double-checking locking
开发者企图已lazy initialization来避开同步,结果当然是失败的
Foo foo
public void useFoo(){
if (foo == null){
synchronized(this){
if (foo == null){
foo = new Foo();
}
}
}
foo.invoke();
}
原因是:foo对象会在构造完全完成之前被存储,这样下一个thread就会调用invoke(),出现错误。
问题:在foo为volaile时,foo会被初始化两次嘛?
本文探讨了条件变量的概念及其在Posix和Java中的应用。通过对比Java的等待-通知机制,阐述了条件变量与锁配合使用的灵活性及注意事项,并讨论了双重检查锁定(double-checking locking)在懒惰初始化中可能遇到的问题。
25万+

被折叠的 条评论
为什么被折叠?



