java - 可能的锁定/性能问题

标签 java multithreading

我正在开发一个处理传入消息的应用程序。我不精通java多线程,我请求你们的帮助,伙计们。以下应用程序结构是否有问题。

有一个带有 stopRequested boolean 字段的主应用程序类。还有一个内部可运行类用于监听传入消息并处理它们。还有另一个线程将 stopRequested 设置为 true。

这种方法有效且可靠,还是我错了?

下面是我的代码的一部分:

class ApplicationClass {

    // we set this var in another thread
    // when it is necessary to stop
    private stopRequested = false;


    public ApplicationClass() {

        // starting message processing thread
        (new Thread(new MessageProcessing())).start();

    }


    private class MessageProcessing implements Runnable {


        public void run() {

            while (!stopRequested) {

                if (getNewMessagesCount() > 0) {

                    processNewMessages();

                }

            }

        }
    }       
} 

谢谢。

最佳答案

有几件事需要考虑。

  1. 正如 sbridges 所指出的,stopRequested 需要具有 volatile 才能解决可见性问题(否则另一个核心上的线程可能看不到更改)。
  2. 如果getNewMessagesCount()不阻塞,那么你的while循环将旋转并消耗核心;这将为您提供最低的延迟,但会占用整个核心。
  3. 您列出的代码似乎是一个简单的处理队列;使用 ArrayBlockingQueue 可能会更好.
  4. 从构造函数启动新线程是危险的。需要担心的是,如果在 ApplicationClass 创建完成之前调用 getMessageCount()processNewMessages() 会发生什么。由于 ApplicationClass 的实例可能处于不完整状态,因此您可能会发现一个相当严重的错误。 (顺便说一句,出于同样的原因,您永远不想让您的代码作为构造函数中事件的监听器订阅。)查看 Effective Java了解有关此主题的更多背景信息。
  5. 你的 while 循环应该检查当前线程是否已被中断,以便它放置得很好;它应该是 while (!stopRequested && !Thread.currentThread().isInterrupted())

编写正确的并发程序很困难。我强烈推荐阅读Java Concurrency in Practice ;它会减轻你很多痛苦。

关于java - 可能的锁定/性能问题,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/6921890/

相关文章:

java - hibernate:保存没有外键的实体时出现异常

Java 有选择地从 zip 中复制文件,以便保留文件时间戳

java - 如何使用 Java 使用斯坦福 NLP 工具生成通用依赖关系?

java - 如何将带有斜杠的 URL 重定向到没有斜杠的相应 URL?

java - Maven 无法更新到 selenium 2.44.0

java - 并行化 : What causes Java threads to block other than synchronization & I/O?

java - 我正在尝试用 Java 多线程绘制 SRTM3-Tile - 我做错了什么?

java - 在多线程环境中使用模拟对象

c - OpenMP (C) 空闲线程的状态

c - 多个线程( worker )执行不同的功能