Telegram Group & Telegram Channel
🧩 Задача «Три счётчика» (с подвохом)
Условие


Дан класс Counter с полем int value и методом increment().

Нужно запустить три параллельных потока, каждый увеличивает счётчик ровно 1 000 000 раз.

В финале программа должна вывести


Counter value = 3000000
Нельзя использовать synchronized, ReentrantLock, Atomic*, LongAdder, VarHandle.


Допустимы любые потоки (обычные или виртуальные) и любая коллекция из стандартной библиотеки Java 19+.

Тип поля менять нельзя — только int.

⚡️
В чем здесь подвох?
Операция value++ не атомарна: «прочитать → увеличить → записать».
Без привычных примитивов придётся найти альтернативный путь синхронизации.

💡 Решение через message queue (Actor‑подход)
Создаём очередь команд BlockingQueue<Runnable>.

Поднимаем один служебный поток servo, который единственный обращается к Counter.value.

Три рабочих потока кладут в очередь лямбду counter::increment.

```java
import java.util.concurrent.*;

final class Counter {
int value;
void increment() { value++; }
}

public class ThreeCountersDemo {
public static void main(String[] args) throws InterruptedException {
Counter counter = new Counter();
BlockingQueue<Runnable> q = new LinkedBlockingQueue<>();

// 1️⃣ Сервисный поток: изменяет value
Thread servo = Thread.startVirtualThread(() -> {
try { while (true) q.take().run(); }
catch (InterruptedException ignored) {}
});

// 2️⃣ Три рабочих потока — по миллиону инкрементов
Runnable worker = () -> {
for (int i = 0; i < 1_000_000; i++)
q.add(counter::increment);
};

Thread.ofVirtual().start(worker);
Thread.ofVirtual().start(worker);
Thread.ofVirtual().start(worker);

// 3️⃣ Ждём опустошения очереди и выключаем сервис
while (!q.isEmpty()) Thread.sleep(10);
servo.interrupt();
servo.join();

System.out.println("Counter value = " + counter.value);
}
}```

Почему это работает
- Value модифицирует только поток servo.

- Очереди java.util.concurrent не были запрещены.

- Параллельность: виртуальные потоки лёгкие (~2 КБ стек), можно масштабировать.



@javatg



tg-me.com/javatg/1821
Create:
Last Update:

🧩 Задача «Три счётчика» (с подвохом)
Условие


Дан класс Counter с полем int value и методом increment().

Нужно запустить три параллельных потока, каждый увеличивает счётчик ровно 1 000 000 раз.

В финале программа должна вывести


Counter value = 3000000
Нельзя использовать synchronized, ReentrantLock, Atomic*, LongAdder, VarHandle.


Допустимы любые потоки (обычные или виртуальные) и любая коллекция из стандартной библиотеки Java 19+.

Тип поля менять нельзя — только int.

⚡️
В чем здесь подвох?
Операция value++ не атомарна: «прочитать → увеличить → записать».
Без привычных примитивов придётся найти альтернативный путь синхронизации.

💡 Решение через message queue (Actor‑подход)
Создаём очередь команд BlockingQueue<Runnable>.

Поднимаем один служебный поток servo, который единственный обращается к Counter.value.

Три рабочих потока кладут в очередь лямбду counter::increment.

```java
import java.util.concurrent.*;

final class Counter {
int value;
void increment() { value++; }
}

public class ThreeCountersDemo {
public static void main(String[] args) throws InterruptedException {
Counter counter = new Counter();
BlockingQueue<Runnable> q = new LinkedBlockingQueue<>();

// 1️⃣ Сервисный поток: изменяет value
Thread servo = Thread.startVirtualThread(() -> {
try { while (true) q.take().run(); }
catch (InterruptedException ignored) {}
});

// 2️⃣ Три рабочих потока — по миллиону инкрементов
Runnable worker = () -> {
for (int i = 0; i < 1_000_000; i++)
q.add(counter::increment);
};

Thread.ofVirtual().start(worker);
Thread.ofVirtual().start(worker);
Thread.ofVirtual().start(worker);

// 3️⃣ Ждём опустошения очереди и выключаем сервис
while (!q.isEmpty()) Thread.sleep(10);
servo.interrupt();
servo.join();

System.out.println("Counter value = " + counter.value);
}
}```

Почему это работает
- Value модифицирует только поток servo.

- Очереди java.util.concurrent не были запрещены.

- Параллельность: виртуальные потоки лёгкие (~2 КБ стек), можно масштабировать.



@javatg

BY Java


Warning: Undefined variable $i in /var/www/tg-me/post.php on line 283

Share with your friend now:
tg-me.com/javatg/1821

View MORE
Open in Telegram


Java Telegram | DID YOU KNOW?

Date: |

However, analysts are positive on the stock now. “We have seen a huge downside movement in the stock due to the central electricity regulatory commission’s (CERC) order that seems to be negative from 2014-15 onwards but we cannot take a linear negative view on the stock and further downside movement on the stock is unlikely. Currently stock is underpriced. Investors can bet on it for a longer horizon," said Vivek Gupta, director research at CapitalVia Global Research.

The Singapore stock market has alternated between positive and negative finishes through the last five trading days since the end of the two-day winning streak in which it had added more than a dozen points or 0.4 percent. The Straits Times Index now sits just above the 3,060-point plateau and it's likely to see a narrow trading range on Monday.

Java from hk


Telegram Java
FROM USA