У меня есть объект архива, который управляет различными массивами байтов и выдает InputStream
и OutputStream
s для их чтения и записи. С каждым массивом байтов связан ReentrantReadWriteLock
< /а>.
Конструктор подкласса InputStream
, который создает архив, получает блокировку для соответствующих данных, а close()
снимает блокировку. Теперь проблема:
Предположим, что у меня есть задача, которая будет выполняться в другом потоке, которому требуются входные данные из архива, которому перед запуском передается InputStream
в качестве аргумента, и он отвечает за закрытие потока после его завершения. Эти требования кажутся несовместимыми с механизмом блокировки, используемым моим архивом данных, потому что
InputStream
создается в потоке, отличном от того, в котором он закрыт.ReentrantReadWriteLock
должен быть освобожден потоком, которому он принадлежит.
Переписывать части программы, которые ожидают InputStream
в качестве входных данных, чтобы избежать #1, неудобно и делает эти части менее гибкими. Использование блокировки, которая разрешает смену владельца, позволит мне избежать # 2, но я не вижу никаких блокировок в Java API, которые могли бы справиться с этим, и я не очень заинтересован в создании пользовательской блокировки, если я не т должен.
Какие есть решения этой проблемы?
getStream(<some-parameters)
. Потоки, использующие этот поток, будут вызывать этот метод, не так ли — и тогда вы сможете выполнить блокировку. Или вы передаете эти объекты последующим потокам или пытаетесь объединитьInputStream
в своем менеджере? - person Kevin Brock   schedule 04.02.2010