AtomicLong используется несколькими потоками?JAVA

Программисты JAVA общаются здесь
Ответить
Anonymous
 AtomicLong используется несколькими потоками?

Сообщение Anonymous »

У меня есть два потока, использующих один экземпляр AtomicLong.
Первый поток только увеличивает, а второй поток только уменьшает.
Два потока, защищенные блокировкой и условием.
Со следующими общими значениями

Код: Выделить всё

final var lock = new ReentrantLock();
final var condition = lock.newCondition();
final var accumulated = new AtomicLong(); // accumulated  from 
Первый поток только увеличивает атомарную переменную.

Код: Выделить всё

// Thread 1
void doSome(final long n) {
try {
lock.lock();
if (accumulated.addAndGet(n) < 0L) { // overflowed
accumulated.set(Long.MAX_VALUE); // > effectively unbounded
}
condition.signal();
} finally {
lock.unlock();
}
}

В то время как второй поток только уменьшает атомарную переменную.

Код: Выделить всё

// Thread 2
while (!Thread.currentThread().isInterrupted()) {

lock.lock();
try {
while (accumulated.get() == 0L) {
try {
condition.await();
} catch (final InterruptedException ie) {
log.info("interrupted while awaiting the condition", ie);
Thread.currentThread().interrupt();
break;
}
}

while (accumulated.getAndDecrement() > 0L) { // -
// do some                              //  |
}                                            //  |
//  |
} finally {                                      //  |
lock.unlock();                               //  |
}                                                //  |
//  |
//  |
//while (accumulated.getAndDecrement() > 0L) { // 

Подробнее здесь: [url]https://stackoverflow.com/questions/79042158/atomiclong-shared-between-threads[/url]
Ответить

Быстрый ответ

Изменение регистра текста: 
Смайлики
:) :( :oops: :roll: :wink: :muza: :clever: :sorry: :angel: :read: *x)
Ещё смайлики…
   
К этому ответу прикреплено по крайней мере одно вложение.

Если вы не хотите добавлять вложения, оставьте поля пустыми.

Максимально разрешённый размер вложения: 15 МБ.

Вернуться в «JAVA»