Potrzebuję ReadWriteLock, który NIE jest reentrant, ponieważ blokada może zostać zwolniona przez inny wątek niż ten, który go uzyskał. (Zdałem sobie z tego sprawę, gdy zacząłem sporadycznie przechwytywać IllegalMonitorStateException.)Czy istnieje nieczytelny ReadWriteLock, którego mogę użyć?
Nie jestem pewien, czy termin ten jest prawidłowy. ReentrantLock pozwala, aby wątek, który obecnie trzyma, blokuje, aby go ponownie zdobyć. NIE chcę tego zachowania, dlatego nazywam to "nierealnym".
Kontekst polega na tym, że mam serwer gniazd przy użyciu puli wątków. NIE ma wątku na połączenie. Żądania mogą być obsługiwane przez różne wątki. Połączenie klienta może wymagać zablokowania w jednym żądaniu i odblokowania w innym żądaniu. Ponieważ żądania mogą być obsługiwane przez różne wątki, muszę mieć możliwość blokowania i odblokowywania w różnych wątkach.
Założę dla tego pytania, że muszę pozostać przy tej konfiguracji i że naprawdę muszę zablokować i odblokować w różnych żądaniach, a zatem prawdopodobnie różnych wątków.
Jest to ReadWriteLock, ponieważ muszę zezwolić na wiele "czytników" LUB na wyłączne "pisarz".
Wygląda na to, że można to napisać przy użyciu programu AbstractQueuedSynchronizer, ale obawiam się, że jeśli sam go napiszę, popełnię subtelny błąd. Mogę znaleźć różne przykłady użycia AbstractQueuedSynchronizer, ale nie ReadWriteLock.
Mogę wziąć źródło OpenJDK ReentrantReadWriteLock i spróbować usunąć element ponownie występujący, ale znowu obawiam się, że nie zrozumiałbym tego poprawnie.
Sprawdziłem w Guava i Apache Commons, ale nie znalazłem nic odpowiedniego. Apache Commons ma RWLockManager, który może zrobić to, czego potrzebuję, ale nie jestem pewien i wydaje się bardziej skomplikowany niż potrzebuję.
Dzięki, to brzmi jak może to wystarczyć. Czytanie dokumentów dla Semafor brzmi tak, jakbym musiał określić opcję "fair". "Ta klasa zapewnia również wygodne metody uzyskiwania i wydawania wielu zezwoleń naraz.Zwróć się do zwiększonego ryzyka nieokreślonego odroczenia, gdy metody te są stosowane bez prawdziwej uczciwości." –
I widzę, że Semafor jest zaimplementowany (przynajmniej w OpenJDK) z AbstractQueuedSynchronizer –
Awesome! Znajduję się w tej samej łodzi (potrzebuję blokady r/w za wielowątkowym/połączonym serwerem oszczędnościowym). To pytanie i odpowiedź są właśnie tym, czego potrzebowałem! Dzięki! – akagixxer