我可以更改我的代码:
class Sample{
private Object _lock=new Object();
public void someMethod(){
synchronized(_lock){
doSomething();
}
}
}
为:
class Sample{
private ISchedulingRule _lock=new SomeSchedulingRule();
public void someMethod(){
try{
Job.getManager().beginRule(_lock);
doSomething();
}finally{
Job.getManager().endRule(_lock);
}
}
}
我正在阅读“实践中的java并发”,他们说如果我想使用一些显式锁定,我必须保证内存可见性。
所以问题是:
如果我可以保证内存可见性,我可以使用底部的代码替换顶部的代码(用eclipse替换内部同步IJobManager.beginRule和IJobManager.endRule)
答案 0 :(得分:1)
假设我找到的源代码here是最新的,您可以检查beginRule
方法是否调用implicitJob.begin
内部有synchronized(this)
块的{{1}}。
答案 1 :(得分:0)
我刚刚发现了一个关于并发的网络教程,它发表了以下声明:
嗯,事实证明Lock接口的合约是它提供了与synchronized相同的>内存屏障行为。
这指的是java.util.concurrent
中的“锁定”界面。我不知道它是否适用于您在此处显示的ISchedulingRule
界面。
答案 2 :(得分:0)
如果您的唯一目标是实现同步,那么答案是肯定的。
那就是说,你需要注意一些(隐藏的)陷阱。由于JobManager
旨在在某种程度上防止死锁,因此使用和定义嵌套规则有一些严格的规则(Java同步块没有的限制)。没有用于检查线程是否持有规则/锁的公共API。此外,在等待线程上调用中断无法取消beginRule
。仅举几例。