1

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

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

我的问题是,在每个对象的(or ) 方法中同步访问共享Store对象的最快(更少开销)方法是什么,特别是考虑到对于单线程访问,同步是多余的(但有在那里,因为还有多线程子类实现)。runcall()HandlerManager

例如,一个synchronized (this.store) {this.store.process()}块会比在调用之前和之后使用Lock对象更好吗?或者每个商店访问内部的单独方法会更快吗?例如,而不是调用,运行类似java.util.concurrentthis.store.process()synchronizedHandlerthis.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()   {}
}
4

2 回答 2

3

一般来说:CAS同步<<synchronizedLock速度而言。当然,这取决于争用的程度和您的操作系统。我建议您尝试每种方法并确定哪种方法最适合您的需要。

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

于 2012-07-31T19:16:48.330 回答
1

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

如果公共资源是队列,那么您可以使用 ArrayBlockingQueue,如果不是,则开始对该资源的同步访问。

于 2012-11-12T12:50:37.297 回答