В языке Java для атомарной работы с одной переменной в многопоточном приложении существуют несколько способов. Напрмер можно использовать обобщённый способ, который подходит не только для атомарного доступа к переменной, но и для других целей. Это использование блоков или методов synchronized, например так:
public class Test2 extends Thread { public Test2(String name){ super(name); } public synchronized static void incrementCount(){ count++; } @Override public void run(){ int sleepTime = 0; for(int i = 0; i < 100; i++){ sleepTime = (int)(Math.random()*10); try { sleep(sleepTime); } catch (InterruptedException e) { e.printStackTrace(); } incrementCount(); } } public static int getCount(){ return count; } private static int count = 0; }Но в языке Java для атомарного доступа к одной переменной существует более элегантный способ. Это классы пакета java.util.concurrent.atomic. Напрмер для целочисленной переменной код будет выглядеть вот так:
import java.util.concurrent.atomic.AtomicInteger; public class Test4 extends Thread { public Test4(String name){ super(name); } @Override public void run(){ int sleepTime = 0; for(int i = 0; i < 100; i++){ sleepTime = (int)(Math.random()*10); try { sleep(sleepTime); } catch (InterruptedException e) { e.printStackTrace(); } count.incrementAndGet(); } } public static int getCount(){ return count.intValue(); } private final static AtomicInteger count = new AtomicInteger(0); }