在这种情况下,有没有更好的替代忙碌等待?

时间:2014-11-15 17:21:04

标签: java multithreading performance thread-synchronization

我有一个Manager类,它封装了一个(相当)低级设施(例如数据库),并作为Worker实例的工厂,

  • 使用Manager的基础设施(数据库)
  • 来自每个实例的参考Manager
  • 同时使用
  • 可以启动引用数据库的异步任务(在某些分离的线程中)。

Manager还有一个关闭数据库连接的shutdown()方法。如果任何worker启动任何正在运行的线程(即在仍有工作人员使用它之前不关闭数据库连接),以确保连接将保持活动状态,我目前有类似的内容:

Manager mgr   = new Manager(database);
Worker worker = mgr.newWorker(arg0, arg1, arg2);

worker.runHeavyComputation();

其中runHeavyComputation的定义如下:

void runHeavyComputation() {
    executor.execute(() -> {
        myManager.tellTaskLaunched();
        doSomethingWithDatabase();
        myManager.tellTaskFinished();
    });
}

其中Manager#tellTaskLaunched()Manager#tellTaskLaunched()的定义如下:

void tellTaskLaunched() {
    taskCounter.incrementAndGet();
}

void tellTaskFinished() {
    taskCounter.decrementAndGet();
}

Manager#shutdown()看起来像这样:

void shutdown() {
    while (taskCounter.get() > 0) {}
    databaseConnection.close();
    database.shutdown()
}

据我所知,对于这样一个简单的问题,这是一个冗长的介绍,但由于我几乎在我阅读的每本书或帖子中都遇到了反忙等待的陈述,我觉得可能有一些替代方案我在这里提供的简单解决方案,所以我想听听你的意见。

请注意,由于shutdown()可能每个应用程序生命周期调用一次(或者它们称为单个长期运行),因此它不是真正的性能问题。但是,如果出现更好的事情,我仍然会改变它。

P.S。请注意,虽然我说“你的意见”,但这不是一个基于意见的基于的问题:)

1 个答案:

答案 0 :(得分:0)

在操作系统级别以上的任何地方,总有一种比繁忙等待更好的选择。

例如,参见Thread上的等待和通知操作。