我可以使用调度规则来替换同步

时间:2012-09-13 15:44:31

标签: java eclipse multithreading concurrency

我可以更改我的代码:

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)

3 个答案:

答案 0 :(得分:1)

假设我找到的源代码here是最新的,您可以检查beginRule方法是否调用implicitJob.begin内部有synchronized(this)块的{{1}}。

答案 1 :(得分:0)

我刚刚发现了一个关于并发的网络教程,它发表了以下声明:

  

嗯,事实证明Lock接口的合约是它提供了与synchronized相同的>内存屏障行为。

这指的是java.util.concurrent中的“锁定”界面。我不知道它是否适用于您在此处显示的ISchedulingRule界面。

答案 2 :(得分:0)

如果您的唯一目标是实现同步,那么答案是肯定的。

那就是说,你需要注意一些(隐藏的)陷阱。由于JobManager旨在在某种程度上防止死锁,因此使用和定义嵌套规则有一些严格的规则(Java同步块没有的限制)。没有用于检查线程是否持有规则/锁的公共API。此外,在等待线程上调用中断无法取消beginRule。仅举几例。