0

我可以从以下位置更改我的代码:

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替换内部同步)

4

3 回答 3

1

假设我在这里找到的源代码是最新的,您可以检查其中有一个大块的beginRule方法调用。implicitJob.beginsynchronized(this)

于 2012-09-13T16:14:09.267 回答
0

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

好吧,事实证明 Lock 接口的一个约定是它提供与同步相同的 >memory barrier 行为。

那是指java.util.concurrent. 我不知道它是否适用于ISchedulingRule您在此处显示的界面。

于 2012-09-13T16:10:40.160 回答
0

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

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

于 2012-09-14T06:54:39.543 回答