ReentrantReadWriteLock: jaka jest różnica między ReadLock a writelock?

To co wiem to:

  • ReadLock oraz WriteLock oddziaływać na siebie jakoś
  • WriteLock jest jak zsynchronizowany
  • ReadLock wydaje się, że nie może pracować sam
Author: informatik01, 2013-08-21

5 answers

ReadLock.lock ();

  • oznacza to, że jeśli jakikolwiek inny wątek jest piszący (tzn. posiada write lock) następnie zatrzymaj się tutaj, aż żaden inny wątek nie będzie pisał.
  • po przyznaniu blokady żaden inny wątek nie będzie mógł napisać (tj. podjąć blokadę zapisu), aż blokada zostanie zwolniona.

WriteLock.lock ();

  • oznacza to, że jeśli jakikolwiek inny wątek to czytanie lub pisanie , zatrzymaj tutaj i czekać aż żaden inny wątek nie będzie czytanie lub pisanie.
  • po przyznaniu blokady żaden inny wątek nie będzie mógł odczytać lub napisz (tzn. weź blokadę odczytu lub zapisu), dopóki blokada nie zostanie zwolniona.

Łącząc je, możesz zorganizować tylko jeden wątek na raz, aby mieć dostęp do zapisu, ale tyle czytników, ile chcesz, może czytać w tym samym czasie, z wyjątkiem sytuacji, gdy wątek pisze.

Ująć inaczej. Za każdym razem, gdy chcesz przeczytać ze struktury, weź przeczytać zamek. Za każdym razem, gdy chcesz zapisać, weź zapisać blokadę. W ten sposób za każdym razem, gdy zdarza się pisanie, nikt nie czyta (możesz sobie wyobrazić, że masz wyłączny dostęp), ale może być wielu czytelników czytających w tym samym czasie, tak długo, jak nikt nie pisze.

 132
Author: OldCurmudgeon,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2019-07-08 12:21:59

Dokumentacja dla ReadWriteLock wyjaśnia to:

ReadWriteLock utrzymuje parę powiązanych blokad, jedną do operacji tylko do odczytu, a drugą do zapisu. Blokada odczytu może być utrzymywana jednocześnie przez wiele wątków czytnika, tak długo, jak nie ma pisarzy. Blokada zapisu jest wyłączna.

Więc możesz mieć wielu czytelników na raz, ale tylko jednego pisarza - i pisarz uniemożliwi czytelnikom czytanie, zbyt. Jest to przydatne, jeśli masz jakieś zasoby który jest bezpieczny do odczytu z wielu wątków i gdzie czytanie jest znacznie bardziej powszechne niż pisanie, ale gdy zasób nie jest w rzeczywistości Tylko do odczytu. (Jeśli nie ma pisarzy i czytanie jest bezpieczne, nie ma potrzeby blokowania w ogóle.)

 21
Author: Jon Skeet,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2013-08-21 10:00:25

Gdy wątek nabywa WriteLock, żaden inny wątek nie może nabyć ReadLock ani WriteLock tej samej instancji ReentrantReadWriteLock, chyba że wątek ten zwolni blokadę. Jednak wiele wątków może uzyskać ReadLock w tym samym czasie.

 8
Author: Eng.Fouad,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2016-05-26 18:59:59

Używając ReadWriteLock, możesz poprawić wydajność aplikacji, w której na obiekcie współdzielonym wykonuje się więcej odczytów niż zapisów.

ReadWriteLock utrzymuje dwie blokady dla operacji odczytu i zapisu. W tym samym czasie można uzyskać tylko jedną blokadę odczytu lub zapisu. Ale wiele wątków może jednocześnie uzyskać blokadę odczytu pod warunkiem, że blokada zapisu nie zostanie uzyskana przez żaden wątek.

ReentrantReadWriteLock jest implementacją ReadWriteLock. Daje blokadę zapisu do najdłuższy wątek oczekiwania, jeśli wiele wątków nie czeka na blokadę odczytu. Jeśli wiele wątków czeka na blokadę odczytu, zostanie im przyznana blokada odczytu.

Czytnik, który uzyskał blokadę odczytu, może ponownie uzyskać blokadę odczytu, podobnie writer może ponownie uzyskać blokadę zapisu i może również uzyskać blokadę odczytu.

Zobacz http://www.zoftino.com/java-concurrency-lock-and-condition-examples

 2
Author: Arnav Rao,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2018-06-09 01:41:15

Rozważ sytuację: w przypadku, gdy struktury danych są read-mostly - są mutowalne i czasami modyfikowane , ale większość dostępów dotyczy głównie odczytu, więc w takim przypadku możemy rozluźnić mechanizm blokujący, aby umożliwić wielu czytnikom dostęp do struktur danych zamiast czekać, gdy jeden czytnik zwolni blokadę. Tak długo, jak każdy wątek ma zagwarantowany aktualny widok udostępnionych danych i żaden wątek nie modyfikuje go podczas przeglądania przez czytelników, nie będzie żadnych problemów. To jest to, na co pozwala odczyt zapisu : dostęp do zasobu może uzyskać wielu czytelników lub jeden pisarz naraz, ale nie oba.

 0
Author: ajain,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2020-05-14 02:21:56