gpt4 book ai didi

java - 这是在java中使用 volatile 变量的好例子吗?

转载 作者:行者123 更新时间:2023-12-02 02:05:18 25 4
gpt4 key购买 nike

我有一个线程监听来自服务器的传入字符串流。我有一个类,我将传入字符串设置为:

public class StreamData {

protected static volatile String INCOMING_STRING = null;

public static String getIncomingString() {
return INCOMING_STRING;
}

public static void setIncomingString(String IncomingString) {
INCOMING_STRING = IncomingString;
}
}

所以在我的Thread1中我有setIncomingString(String IncomingString)现在我有另一个线程 Thread2,它监听客户端请求并通过调用第一个 getIncomingString() 发回数据。

我在这里使用 volatile 的原因是因为我在两个线程之间共享数据,并且我读到在这种情况下应该使用 volatile 变量。我的想法正确吗?

最佳答案

从某种意义上来说它是安全的。调用 getIncomingString 的线程保证能看到最近通过调用 setIncomingString 写入的字符串。

但是...

尚不清楚此属性是否足以让 StreamData 发挥作用。例如:

  1. Thread1 接收一个字符串并调用 setIncomingString
  2. Thread1 收到第二个字符串并再次调用 setIncomingString
  3. Thread2 调用 getIncomingString ...并获取第二个字符串。

在上面的序列中,第一个字符串已经丢失,并且两个线程都没有意识到这一点。

StreamData 类不允许您“流式传输”数据。为了实现这一点,您需要类似于经典队列类,其中:

  • 一个线程添加字符串,第二个线程删除字符串,
  • 如果队列太满,第一个线程会阻塞,
  • 如果队列为空,第二个线程将阻塞,并且
  • 两个线程都不必执行“繁忙循环”来等待某些事情发生。

仅使用 volatile 无法实现这一点。

关于java - 这是在java中使用 volatile 变量的好例子吗?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/50925577/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com