Difference between getAndSet and compareAndSet in AtomicBoolean

前端 未结 4 1264
攒了一身酷
攒了一身酷 2021-01-04 01:00

The thread title should be self-explnatory... I\'m a bit confused between the specification of below methos from AtomicBoolean class:

  • java.u
相关标签:
4条回答
  • 2021-01-04 01:20

    The documentation is pretty clear.

    • getAndSet --> "Atomically sets to the given value and returns the previous value."
    • compareAndSet --> "Atomically sets the value to the given updated value if the current value == the expected value."

    Not surprisingly, compareAndSet takes two arguments.

    In your specific case:

    • if (flag.getAndSet(false)) will set flag to false only if its previous value was true
    • That would be the equivalent of if (flag.compareAndSet(true, false))
    0 讨论(0)
  • 2021-01-04 01:25

    You can look at the code for better understanding :

    public final boolean getAndSet(boolean newValue) {
        for (;;) {
            boolean current = get();
            if (compareAndSet(current, newValue))
                return current;
        }
    }
    

    In getAndSet, if the value of the boolean has changed between the time you get() the old value and the time you try to change its value, compareAndSet won't change its value. Therefore, getAndSet calls compareAndSet in a loop until the boolean is set to the new value.

    As to your code example :

    flag.getAndSet(false) returns the old value of the AtomicBoolean. On the other hand, flag.compareAndSet(x,false) (note there are two arguments) returns whether the AtomicBoolean was modified, or in other words, it returns whether the old value of the AtomicBoolean was x.

    0 讨论(0)
  • 2021-01-04 01:41

    The thread is a bit old but nobody mentioned that getAndSet will be more efficient than compareAndSet. CAS is a very costly instruction (on all CPU architectures, so JVM does not matter here). So they are not really equivalent.

    So regarding the OP, both methods produce the same behaviour but it will not have the same performance, use getAndSet when you can.

    0 讨论(0)
  • 2021-01-04 01:42

    When I have checked the implementation I found following

    public final boolean getAndSet(boolean newValue) {
        for (;;) {
            boolean current = get();
            if (compareAndSet(current, newValue))
                return current;
        }
    }
    

    Also when checking the javadoc, compareAndSet sets value only if the comparison pass while getAndSet simply set the value and return the previous value.

    0 讨论(0)
提交回复
热议问题