最快的同步技术

时间:2012-07-31 19:12:36

标签: java synchronization locking runnable callable

以下是一种相当常见的访问公共资源的方案,无论是以顺序(单线程)还是并发(多线程)方式,都需要最快的技术。

更具体地说(参见下面的示例源代码),Manager类使用公共资源创建Runnable(或Callable)类(Handler)的一些实例(一个Store对象)。 Manager类实际上是子类,并且它的execute()方法被重写以在同一个线程或多个线程中顺序运行处理程序(例如,通过ExecutorService),具体取决于子类实现

我的问题是,在每个{{1}的Store(或run)方法内同步对共享call()对象的访问的最快(开销较小)方式是什么?对象,特别是考虑到,对于单线程访问,同步是多余的(但必须存在,因为还有多线程Handler子类实现)。

例如,Manager块会比调用synchronized (this.store) {this.store.process()}之前和之后使用Lock java.util.concurrent对象更好吗?或者,对于每个商店访问,this.store.process()内的单独synchronized方法会更快吗?例如,不要调用Handler,而是运行类似

的内容
this.store.process()

以下是(示例)源代码。

private synchronized void processStore()
{
    this.store.process();
}

2 个答案:

答案 0 :(得分:3)

一般来说:CAS同步< synchronized< Lock就速度而言。当然,这取决于争用程度和操作系统。我建议你尝试各自,并确定哪个是你需要的最快。

Java还执行lock elision以避免锁定仅对一个线程可见的对象。

答案 1 :(得分:1)

据我所知,如果您的应用运行或将以群集模式运行,那么synchronized将无效(不同的JVM),因此Lock将是唯一的选择。

如果公共资源是队列,那么您可以使用ArrayBlockingQueue,如果没有,则启动此资源的同步访问。