以下是一种相当常见的访问公共资源的方案,无论是以顺序(单线程)还是并发(多线程)方式,都需要最快的技术。
更具体地说(参见下面的示例源代码),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();
}
答案 0 :(得分:3)
一般来说:CAS同步< synchronized
< Lock
就速度而言。当然,这取决于争用程度和操作系统。我建议你尝试各自,并确定哪个是你需要的最快。
Java还执行lock elision以避免锁定仅对一个线程可见的对象。
答案 1 :(得分:1)
据我所知,如果您的应用运行或将以群集模式运行,那么synchronized将无效(不同的JVM),因此Lock将是唯一的选择。
如果公共资源是队列,那么您可以使用ArrayBlockingQueue,如果没有,则启动此资源的同步访问。