Нет данных, которыми вы делитесь между вашими потоками ... каждая создает свою собственную AtomicLong
, без обмена Даже если он будет передан, не будет никакой гарантии, что числа будут напечатаны по порядку. Они даже не гарантируют, что все числа будут напечатаны (некоторые из них могут быть напечатаны более одного раза).
Если я изменю ваш код следующим образом:
public static class Account implements Runnable {
private static final AtomicLong amount = new AtomicLong(0);
public Account(long difference) {
amount.set(difference);
}
public void run() {
System.out.println("The Balance is : " + amount);
}
}
Вот пример я получаю вывод:
The Balance is : 2
The Balance is : 2
The Balance is : 2
The Balance is : 4
The Balance is : 5
The Balance is : 6
The Balance is : 7
The Balance is : 8
The Balance is : 9
The Balance is : 9
Причина в том, что возможен следующий сценарий:
- основной поток создает
Account(0)
. Это записывает 0
в общий AtomicLong
., Thread-0
запускается - основной поток создает
Account(1)
. Это записывает 1
в общий AtomicLong
. Thread-0
выводит значение, теперь оно 1
. В этом случае 0
никогда не будет напечатано.
Единственное, что AtomicLong
гарантирует вам, это то, что все записи в значение всегда будут видны всем потокам, выполняющим чтение впоследствии.
Свойства переменных atomi c подробно описаны в javado c (см. здесь ).