有 Java 编程相关的问题?

你可以在下面搜索框中键入要查询的问题!

对来自asyn线程的信号使用静态布尔与原子布尔的java差异

所以我有很多asyn线程同时运行。现在,当任何作业失败时,我将布尔作业失败标志设置为true。这将表明其中一个子任务已失败。 我可以使用静态布尔变量而不是Java并发原子布尔变量,并且仍然可以实现相同的功能吗


共 (4) 个答案

  1. # 1 楼答案

    对。你可以

    volatile static AtomicBoolean flag
    
  2. # 2 楼答案

    Can I use static boolean variable instead of Java concurrent atomic boolean and still achieve the same functionality?

    不!静态意味着与原子完全不同的东西

    如果你定义这个

    static boolean staticFlag;
    

    在类Foo中,那么staticFlag是属于该类而不是该类实例的变量

    因此,如果执行Foo.staticFlag = true所有类Foo的实例将受到该更改的影响

    另一方面

    如果多个线程正在访问同一个布尔值,则存在争用条件 在那里,您可以使用原子布尔来防止同步问题

  3. # 3 楼答案

    据我所知,如果多个线程中的一个无法执行某些操作,您“只是”希望将全局状态设置为true。是的,您可以使用静态布尔值来实现这一点,但是您应该声明它为volatile

    在我的世界里,你可以这样做,因为你的线程中没有一个会访问该布尔值进行比较等。如果他们访问它,他们会将其设置为true。他们不会在意布尔值是哪个。没有线程会将其设置为false

  4. # 4 楼答案

    主要区别是Thread-SafetyAtomicBoolean是线程安全的,而布尔变量不是线程安全的,不管它是否是静态的。静态变量是指它是类变量而不是实例变量。 见Oracle class variable

    To answer your question

    如果您从不同的线程访问(读/写)您的标志(您可能会这样做),请使用AtomicBoolean,否则使用标准boolean就足够了但是我建议使用AtomicBoolean,因为您处理的是少数写入标志的线程,而另一个线程可能会读取它

    第二个选项与其他答案一样,通过使用volatile关键字来确保线程安全

    public static volatile myFlag = false;
    

    garenty线程是否安全