Java 我可以用SchedulingRule代替同步吗

Java 我可以用SchedulingRule代替同步吗,java,eclipse,multithreading,concurrency,Java,Eclipse,Multithreading,Concurrency,我可以从以下位置更改代码: class Sample{ private Object _lock=new Object(); public void someMethod(){ synchronized(_lock){ doSomething(); } } } 致: 我在读“java并发性实践”,他们说如果我想使用显式锁,我必须保证内存的可见性 因此,问题是: 如果我能保证内存的可见性,我能用底部的代码替换顶部的代

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

class Sample{
    private Object _lock=new Object();
    public void someMethod(){
        synchronized(_lock){
            doSomething();
        }
    }
}
致:

我在读“java并发性实践”,他们说如果我想使用显式锁,我必须保证内存的可见性

因此,问题是:


如果我能保证内存的可见性,我能用底部的代码替换顶部的代码吗(用eclipse IJobManager.beginRule和IJobManager.endRule替换内部同步)我刚刚找到一个关于并发性的web教程,它给出了以下声明:

事实证明,锁接口的契约是,它提供与同步相同的>内存屏障行为


这是指
java.util.concurrent
中的“锁”接口。我不知道它是否适用于您在此显示的
isSchedulingRule
接口。

假设我找到的源代码是最新的,您可以检查
beginRule
方法是否调用
implicitJob.begin
,它有一个较大的
已同步(this)
block in.

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


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

为什么要使用底部的代码而不是顶部的代码?@Tudor:他感兴趣的是使用显式锁对象是否能保证内存可见性。这是一个一般性的问题。@Alex D:你说的“显式锁”是什么?@Tudor:IsSchedulingRule有两种方法,它们都非常强大。如果我能把它作为一个显式的lock@Tudor:查看
java.util.concurrent
的API文档。这里有许多显式锁类。
beginRule
方法实际上在内部使用了
synchronized
。这回答了OP的问题——你应该将其作为单独的答案发布。它是3.50。eclipse的最新版本是4.2Juno。我想我错了。它不应该取决于是否使用同步来实现。@Temple Wing:
synchronized
块引入隐式内存围栏,从而提供内存可见性。这不是你要找的吗?
class Sample{
    private ISchedulingRule _lock=new SomeSchedulingRule();
    public void someMethod(){
        try{
            Job.getManager().beginRule(_lock);
            doSomething();
        }finally{
            Job.getManager().endRule(_lock);
        }
    }
}