2013-04-16 1 views
2

Есть ли какой-либо Lock на Java, который позволил бы мне это сделать?Лучший Lock для параллелизма: один WRITE и бесконечное число READ

  • одна операции WRITE в то время
  • бесконечного числа операций чтения (даже если является записываемома замок приобрел)
  • необязательны, но большие: Тайм-аут блокировки - разблокировки через некоторое время избегать тупика навсегда
+4

... Это называется блокировкой для записи, и никакая блокировка чтения не читается? – Xymostech

+0

@ Xymostech да, но все же операция чтения должна быть продолжена, даже если уже есть блокировка записи. – user219882

+0

Не понимаю, почему блокировка записи блокирует чтение. Если вы просто не запрашиваете блокировку при чтении, ничего не остановит вас ... – Xymostech

ответ

1

Похоже, что нет никаких обстоятельств, при которых чтения не могут произойти. Вам действительно нужен замок для чтения? Если нет, то вы должны просто использовать Semaphore с 1 разрешением на защиту разрешения на запись. Если вы все еще хотите отслеживать, сколько чтений происходит без возможности предотвратить, вы всегда можете подсчитать, сколько чтений находится в полете с AtomicInteger.

+0

Вы правы. Мне не нужна блокировка чтения. Но Семафор выглядит так, что он не может выпустить разрешения после таймаута. – user219882

+2

@ Томас Я знаю много замков, которые могут быть тайм-аут во время фазы приобретения, но я не знаю, что автоматически освобождает себя после приобретения. Вам, вероятно, нужно будет написать что-то обычай для этого, но я чувствую, что должен сильно предостеречь вас от этого. Если у вас есть задача, которая работает дольше, чем таймаут, вы * будете * иметь повреждение данных в присутствии нескольких авторов. Чтобы избежать тупика, я думаю, вам лучше следить за состоянием без прогрессирования, а затем [прерывать] (http://docs.oracle.com/javase/1.5.0/docs/api/java/lang/Thread. html # interrupt% 28% 29) задачи, если это произойдет. – sigpwned

+0

ok ... спасибо – user219882