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: |

Importantly, that investor viewpoint is not new. It cycles in when conditions are right (and vice versa). It also brings the ineffective warnings of an overpriced market with it.Looking toward a good 2022 stock market, there is no apparent reason to expect these issues to change.

Telegram has exploded as a hub for cybercriminals looking to buy, sell and share stolen data and hacking tools, new research shows, as the messaging app emerges as an alternative to the dark web.An investigation by cyber intelligence group Cyberint, together with the Financial Times, found a ballooning network of hackers sharing data leaks on the popular messaging platform, sometimes in channels with tens of thousands of subscribers, lured by its ease of use and light-touch moderation.Java from kr


Telegram Java
FROM USA