What's Java's equivalent of .Net's Interlocked class? What's Java's equivalent of .Net's Interlocked class? multithreading multithreading

What's Java's equivalent of .Net's Interlocked class?


Thread safety can be achieved via synchronized functions.Wrap your int (or such data) in a class which provides the required functionalities via synchronized methods, e.g.

public class X{  protected int x;  public synchronized void set( int value )  {    x = value;  }}

You can also use classes from the java.util.concurrent.atomic package, e.g. AtomicInteger or AtomicIntegerArray

Why this answer won't work

I just wanted to be sure to point out exactly what is wrong with this answer, in case anyone things that synchronized can be used to solve thread race effects

| Thread A      | Thread B         | |---------------|------------------|| read x (x=4)  |                  ||               | read x (x=4)     || Calculate 4+1 |                  || EAX ← 5       |                  ||               | Calculate 4+1    ||               | EAX ← 5          || Start sync    |                  || {             | Start sync       || { x ← 5       |    wait          || {             |    wait          || End sync      |    wait          ||               | {                | |               | { x ← 5          ||               | {                | |               | End sync         |

The end result of the operations:

x = 4;x += 1;x += 1;

is that x = 5 rather than 6.

The same issue exists with the volatile keyword. The volatile keyword doesn't save you from thread effects. The volatile keyword only ensures that

  • caches are flushed before a variable is read
  • caches are flushed after a value is written

Strictly speaking, volatile ensures that memory operations are not reordered around a volatile variable. Which means you still suffer from the:

  • read from x
  • write to x

problem.


private final static AtomicInteger at = new AtomicInteger();public void run() {    at.set(7);    int i = at.incrementAndGet();