【问题标题】:Is the volatile mark necessary for a queue with one thread adding and another reading?一个线程添加和另一个读取的队列是否需要 volatile 标记?
【发布时间】:2012-08-07 19:12:04
【问题描述】:

针对this thread 中的一些 cmets,我想知道是否创建一个队列,将一个线程添加到其中,另一个线程从中读取需要“易失性”标记?

我想大多数情况都可以,但是如果没有它,在大小为 1 的队列中读取和写入可能会导致问题?

目标:

  • 一个线程安全队列,我可以在其中发布要通过 TCP 套接字连接发送的消息。输出流将由另一个类管理,该类将在每个循环开始时检查队列是否为空

我的想法/想法:

  • 也许有一个我在研究中没有发现的 TCP 套接字的内置队列?
  • 在这种情况下使用 volatile 是否合适,还是应该使用阻塞或锁定调用?

提前致谢。

【问题讨论】:

  • 有一个 LinkedBlockingQueue 类
  • 您接受后我更新了我的答案。请阅读新信息。

标签: android tcp queue volatile


【解决方案1】:

如果您想要像您提到的那样同步访问,请使用锁定对象。

Volatile is not really used in this context。将您的 List myList 对象声明为 volatile 意味着如果您曾经尝试实例化一个新对象并将其设置为 myList 变量,那么线程将保证知道(大致)分配了一个新对象。它不会阻止或同步与实际对象有关的任何内容。

基本上,就像您说的那样,您需要确保在读取或写入列表时,不会弄乱列表并导致意外错误。要阻止两件事同时发生,请使用锁定对象和 Java 同步关键字,或者使用已经为您同步读/写的 List 类型。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2015-11-02
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-05-27
    • 2015-07-17
    • 2011-07-22
    相关资源
    最近更新 更多