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

Telegram hopes to raise $1bn with a convertible bond private placement

The super secure UAE-based Telegram messenger service, developed by Russian-born software icon Pavel Durov, is looking to raise $1bn through a bond placement to a limited number of investors from Russia, Europe, Asia and the Middle East, the Kommersant daily reported citing unnamed sources on February 18, 2021.The issue reportedly comprises exchange bonds that could be converted into equity in the messaging service that is currently 100% owned by Durov and his brother Nikolai.Kommersant reports that the price of the conversion would be at a 10% discount to a potential IPO should it happen within five years.The minimum bond placement is said to be set at $50mn, but could be lowered to $10mn. Five-year bonds could carry an annual coupon of 7-8%.

What is Telegram Possible Future Strategies?

Cryptoassets enthusiasts use this application for their trade activities, and they may make donations for this cause.If somehow Telegram do run out of money to sustain themselves they will probably introduce some features that will not hinder the rudimentary principle of Telegram but provide users with enhanced and enriched experience. This could be similar to features where characters can be customized in a game which directly do not affect the in-game strategies but add to the experience.

Java from nl


Telegram Java
FROM USA