gpt4 book ai didi

java - 坚持更新由多个线程更新的单个变量

转载 作者:行者123 更新时间:2023-11-29 03:08:37 25 4
gpt4 key购买 nike

我有一个应用程序使用多个线程写入下面的单个变量“theVar”。 99% 的时间我都有正确的数据,但有时会丢失一些数据。我已经尝试解决这个问题将近一个星期了,我真的迷路了。它只是突然发生,我丢失了数据,这是一个非常严重的问题。我做错了什么?

class Singleton {
private volatile Singleton instance;
private volatile String theVar = null;
private final Object lock = new Object();

public void setVar(String newVar) {
synchronized (lock) {
theVar = newVar;
}
}

public String getVar() {
synchronized (lock) {
return theVar;
}
}

public void appendVar(String text) {
synchronized (lock) {
theVar += text;
}
}

protected Singleton() {
}

public static Singleton getInstance() {
Singleton instance = this.instance;
if (instance == null) {
synchronized (this) {
instance = this.instance;
if (instance == null) {
instance = this.instance = new Singleton();
}
}
}

return instance;
}
}

最佳答案

Buddy,对于创建 Singleton,我的建议是使用下面的方法,它是 100% 线程安全的并且没有同步问题,因为它利用了 Java 的类加载机制。

像这个类 Provider 只会加载一次 (JVM 永远不会加载一个类两次) 当你调用 getInstance() 时第一次由第一个线程执行,因此将只存在一个 Singleton 类的实例。

即使有 2 个线程尝试同时调用 getInstance() 方法,但 JVM 不会加载 Provider 两次,因为我们正在创建 Singleton 类实例作为静态初始化的一部分,这意味着在类加载时,因此只会存在一个实例。

在您的情况下,可能有 2 个线程在同一时间导致了一些问题;试试这个,我希望你能得到 100% 的结果。如果不是,那么请提供您如何运行它的代码。

    public class Singleton {
private Singleton() {
}

private volatile String theVar = null;

public void setVar(String newVar) {
synchronized (this) {
theVar = newVar;
}
}

public String getVar() {
synchronized (this) {
return theVar;
}
}

public void appendVar(String text) {
synchronized (this) {
theVar += text;
}
}

private static class Provider {
static final Singleton INSTANCE = new Singleton();
}

public static Singleton getInstance() {
return Provider.INSTANCE;
}
}

关于java - 坚持更新由多个线程更新的单个变量,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/30719787/

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