Π”ΠΎΠ±Π°Π²ΠΈΡ‚ΡŒ Π² ΠΊΠΎΡ€Π·ΠΈΠ½ΡƒΠŸΠΎΠ·Π²ΠΎΠ½ΠΈΡ‚ΡŒ
Найти Π² Π”Π·Π΅Π½Π΅
Java

πŸš€ Java: ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΡƒΠΉΡ‚Π΅ ReentrantReadWriteLock, ΠΊΠΎΠ³Π΄Π° Ρ‡Ρ‚Π΅Π½ΠΈΠΉ Π½Π°ΠΌΠ½ΠΎΠ³ΠΎ большС, Ρ‡Π΅ΠΌ записСй

Если Ρƒ вас Π΅ΡΡ‚ΡŒ ΠΎΠ±Ρ‰ΠΈΠΉ рСсурс (Π½Π°ΠΏΡ€ΠΈΠΌΠ΅Ρ€, кэш, конфигурация ΠΈΠ»ΠΈ состояниС сСрвиса), ΠΊΠΎΡ‚ΠΎΡ€Ρ‹ΠΉ часто Ρ‡ΠΈΡ‚Π°ΡŽΡ‚ Ρ€Π°Π·Π½Ρ‹Π΅ ΠΏΠΎΡ‚ΠΎΠΊΠΈ, Π½ΠΎ Ρ€Π΅Π΄ΠΊΠΎ ΠΈΠ·ΠΌΠ΅Π½ΡΡŽΡ‚ β€” ΠΎΠ±Ρ‹Ρ‡Π½Ρ‹ΠΉ synchronized ΠΌΠΎΠΆΠ΅Ρ‚ сильно Ρ‚ΠΎΡ€ΠΌΠΎΠ·ΠΈΡ‚ΡŒ систСму. Π’ Ρ‚Π°ΠΊΠΈΡ… случаях Π»ΡƒΡ‡ΡˆΠ΅ ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚ΡŒ ReentrantReadWriteLock ΠΈΠ· java.util.concurrent. ИдСя простая: - Read Lock β€” позволяСт нСскольким ΠΏΠΎΡ‚ΠΎΠΊΠ°ΠΌ Ρ‡ΠΈΡ‚Π°Ρ‚ΡŒ Π΄Π°Π½Π½Ρ‹Π΅ ΠΎΠ΄Π½ΠΎΠ²Ρ€Π΅ΠΌΠ΅Π½Π½ΠΎ - Write Lock β€” Ρ€Π°Π·Ρ€Π΅ΡˆΠ°Π΅Ρ‚ запись Ρ‚ΠΎΠ»ΡŒΠΊΠΎ ΠΎΠ΄Π½ΠΎΠΌΡƒ ΠΏΠΎΡ‚ΠΎΠΊΡƒ ΠΈ Π±Π»ΠΎΠΊΠΈΡ€ΡƒΠ΅Ρ‚ всСх ΠΎΡΡ‚Π°Π»ΡŒΠ½Ρ‹Ρ… Π’Π°ΠΊΠΈΠΌ ΠΎΠ±Ρ€Π°Π·ΠΎΠΌ ΠΌΠΎΠΆΠ½ΠΎ сильно ΡƒΠ²Π΅Π»ΠΈΡ‡ΠΈΡ‚ΡŒ ΠΏΠ°Ρ€Π°Π»Π»Π΅Π»ΠΈΠ·ΠΌ: дСсятки ΠΏΠΎΡ‚ΠΎΠΊΠΎΠ² ΠΌΠΎΠ³ΡƒΡ‚ Ρ‡ΠΈΡ‚Π°Ρ‚ΡŒ Π΄Π°Π½Π½Ρ‹Π΅ ΠΎΠ΄Π½ΠΎΠ²Ρ€Π΅ΠΌΠ΅Π½Π½ΠΎ, Π° запись происходит эксклюзивно. Когда это ΠΏΠΎΠ»Π΅Π·Π½ΠΎ: - Π΄Π°Π½Π½Ρ‹Π΅ Ρ‡ΠΈΡ‚Π°ΡŽΡ‚ΡΡ ΠΎΡ‡Π΅Π½ΡŒ часто - записи происходят Ρ€Π΅Π΄ΠΊΠΎ - Π²Π°ΠΆΠ½ΠΎ максимально ΡƒΠ²Π΅Π»ΠΈΡ‡ΠΈΡ‚ΡŒ throughput систСмы ΠŸΡ€ΠΈΠΌΠ΅Ρ€Ρ‹ использования: кэш Π² сСрвисС, ΠΊΠΎΠ½Ρ„ΠΈΠ³ΡƒΡ€Π°Ρ†ΠΈΠΈ, ΠΌΠ΅Ρ‚Π°Π΄Π°Π½Π½Ρ‹Π΅, in-memory storage, state ΠΌΠ΅Π½Π΅Π΄ΠΆΠ΅Ρ€Ρ‹. import java.util.concurrent.locks.ReentrantReadWriteLock; public class SharedValue { private final ReentrantReadWriteLock lock = new ReentrantReadWriteLock(); private int value = 0; public int r

πŸš€ Java: ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΡƒΠΉΡ‚Π΅ ReentrantReadWriteLock, ΠΊΠΎΠ³Π΄Π° Ρ‡Ρ‚Π΅Π½ΠΈΠΉ Π½Π°ΠΌΠ½ΠΎΠ³ΠΎ большС, Ρ‡Π΅ΠΌ записСй

Если Ρƒ вас Π΅ΡΡ‚ΡŒ ΠΎΠ±Ρ‰ΠΈΠΉ рСсурс (Π½Π°ΠΏΡ€ΠΈΠΌΠ΅Ρ€, кэш, конфигурация ΠΈΠ»ΠΈ состояниС сСрвиса), ΠΊΠΎΡ‚ΠΎΡ€Ρ‹ΠΉ часто Ρ‡ΠΈΡ‚Π°ΡŽΡ‚ Ρ€Π°Π·Π½Ρ‹Π΅ ΠΏΠΎΡ‚ΠΎΠΊΠΈ, Π½ΠΎ Ρ€Π΅Π΄ΠΊΠΎ ΠΈΠ·ΠΌΠ΅Π½ΡΡŽΡ‚ β€” ΠΎΠ±Ρ‹Ρ‡Π½Ρ‹ΠΉ synchronized ΠΌΠΎΠΆΠ΅Ρ‚ сильно Ρ‚ΠΎΡ€ΠΌΠΎΠ·ΠΈΡ‚ΡŒ систСму.

Π’ Ρ‚Π°ΠΊΠΈΡ… случаях Π»ΡƒΡ‡ΡˆΠ΅ ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚ΡŒ ReentrantReadWriteLock ΠΈΠ· java.util.concurrent.

ИдСя простая:

- Read Lock β€” позволяСт нСскольким ΠΏΠΎΡ‚ΠΎΠΊΠ°ΠΌ Ρ‡ΠΈΡ‚Π°Ρ‚ΡŒ Π΄Π°Π½Π½Ρ‹Π΅ ΠΎΠ΄Π½ΠΎΠ²Ρ€Π΅ΠΌΠ΅Π½Π½ΠΎ

- Write Lock β€” Ρ€Π°Π·Ρ€Π΅ΡˆΠ°Π΅Ρ‚ запись Ρ‚ΠΎΠ»ΡŒΠΊΠΎ ΠΎΠ΄Π½ΠΎΠΌΡƒ ΠΏΠΎΡ‚ΠΎΠΊΡƒ ΠΈ Π±Π»ΠΎΠΊΠΈΡ€ΡƒΠ΅Ρ‚ всСх ΠΎΡΡ‚Π°Π»ΡŒΠ½Ρ‹Ρ…

Π’Π°ΠΊΠΈΠΌ ΠΎΠ±Ρ€Π°Π·ΠΎΠΌ ΠΌΠΎΠΆΠ½ΠΎ сильно ΡƒΠ²Π΅Π»ΠΈΡ‡ΠΈΡ‚ΡŒ ΠΏΠ°Ρ€Π°Π»Π»Π΅Π»ΠΈΠ·ΠΌ: дСсятки ΠΏΠΎΡ‚ΠΎΠΊΠΎΠ² ΠΌΠΎΠ³ΡƒΡ‚ Ρ‡ΠΈΡ‚Π°Ρ‚ΡŒ Π΄Π°Π½Π½Ρ‹Π΅ ΠΎΠ΄Π½ΠΎΠ²Ρ€Π΅ΠΌΠ΅Π½Π½ΠΎ, Π° запись происходит эксклюзивно.

Когда это ΠΏΠΎΠ»Π΅Π·Π½ΠΎ:

- Π΄Π°Π½Π½Ρ‹Π΅ Ρ‡ΠΈΡ‚Π°ΡŽΡ‚ΡΡ ΠΎΡ‡Π΅Π½ΡŒ часто

- записи происходят Ρ€Π΅Π΄ΠΊΠΎ

- Π²Π°ΠΆΠ½ΠΎ максимально ΡƒΠ²Π΅Π»ΠΈΡ‡ΠΈΡ‚ΡŒ throughput систСмы

ΠŸΡ€ΠΈΠΌΠ΅Ρ€Ρ‹ использования:

кэш Π² сСрвисС, ΠΊΠΎΠ½Ρ„ΠΈΠ³ΡƒΡ€Π°Ρ†ΠΈΠΈ, ΠΌΠ΅Ρ‚Π°Π΄Π°Π½Π½Ρ‹Π΅, in-memory storage, state ΠΌΠ΅Π½Π΅Π΄ΠΆΠ΅Ρ€Ρ‹.

import java.util.concurrent.locks.ReentrantReadWriteLock;

public class SharedValue {

private final ReentrantReadWriteLock lock = new ReentrantReadWriteLock();

private int value = 0;

public int readValue() {

lock.readLock().lock();

try {

return value;

} finally {

lock.readLock().unlock();

}

}

public void writeValue(int newValue) {

lock.writeLock().lock();

try {

value = newValue;

} finally {

lock.writeLock().unlock();

}

}

}

Π“Π»Π°Π²Π½Ρ‹ΠΉ плюс:

нСсколько ΠΏΠΎΡ‚ΠΎΠΊΠΎΠ² ΠΌΠΎΠ³ΡƒΡ‚ Ρ‡ΠΈΡ‚Π°Ρ‚ΡŒ ΠΎΠ΄Π½ΠΎΠ²Ρ€Π΅ΠΌΠ΅Π½Π½ΠΎ, Π½Π΅ блокируя Π΄Ρ€ΡƒΠ³ Π΄Ρ€ΡƒΠ³Π°.

Но ΠΊΠ°ΠΊ Ρ‚ΠΎΠ»ΡŒΠΊΠΎ начинаСтся запись - всС чтСния ΠΈ записи Π±Π»ΠΎΠΊΠΈΡ€ΡƒΡŽΡ‚ΡΡ, ΠΏΠΎΠΊΠ° опСрация Π½Π΅ Π·Π°Π²Π΅Ρ€ΡˆΠΈΡ‚ΡΡ.