Первый поток только увеличивает, а второй поток только уменьшает.
Два потока, защищенные блокировкой и условием.
Со следующими общими значениями
Код: Выделить всё
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]
Мобильная версия