以下是访问公共资源的一种相当常见的场景,以顺序(单线程)或并发(多线程)方式,需要最快的技术。
更具体地说(参见下面的示例源代码),一个Manager
类创建了一个Runnable
(或Callable
)类(Handler
)的一些实例,这些实例具有一个公共资源(一个Store
对象)。该类Manager
实际上是子类化的,并且其execute()
方法被重写以在同一个线程中或在多个线程中(例如,通过一个ExecutorService
)顺序运行处理程序,具体取决于子类的实现。
我的问题是,在每个对象的(or ) 方法中同步访问共享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();
}
以下是(示例)源代码。
public class Manager
{
public Manager()
{
Store store = new Store(); // Resource to be shared
List<Handler> handlers = createHandlers(store, 10);
execute(handlers);
}
List<Handler> createHandlers(Store store, int count)
{
List<Handler> handlers = new ArrayList<Handler>();
for (int i=0; i<count; i++)
{
handlers.add(new Handler(store));
}
return handlers;
}
void execute(List<Handler> handlers)
{
// Run handlers, either sequentially or concurrently
}
}
public class Handler implements Runnable // or Callable
{
Store store; // Shared resource
public Handler(Store store)
{
this.store = store;
}
public void run() // Would be call(), if Callable
{
// ...
this.store.process(); // Synchronization needed
// ...
this.store.report(); // Synchronization needed
// ...
this.store.close(); // Synchronization needed
// ...
}
}
public class Store
{
void process() {}
void report() {}
void close() {}
}