Это выглядит как хорошая реализация с первого взгляда. Использование разных блокировок всегда является для меня красным флагом, поэтому я внимательно посмотрел на некоторые крайних случаев, включающих одновременные вызовы Pop
и Push
, и это кажется безопасным. Я подозреваю, что вы, вероятно, узнали о реализации связного списка очереди блокировки, а? Причина, по которой это безопасно, заключается в том, что вы всегда ссылаетесь только на LastNode
из Push
и FirstNode
из Pop
, иначе весь трюк развалится.
Единственное, что бросается в глаза прямо сейчас, это то, что когда вы пытаетесь освободить счет от Semaphore
, он выдаст исключение, если он уже заполнен, так что вы можете принять меры против этого. 1 В противном случае вы получите дополнительные узлы в связанном списке, и очередь будет 1) иметь больше максимального количества элементов и 2) она будет заблокирована в реальном времени.
Обновление:
Я еще об этом подумал. Этот Release
вызов в методе Push
будет очень проблематичным. Я вижу только одно возможное решение. Удалите параметр maxItems
из конструктора и разрешите семафору считать до Int.MaxValue
. В противном случае вам придется радикально изменить свой подход, в результате чего будет реализована реализация, которая не будет близка к той, которая у вас сейчас есть.
1 Я думаю, вы поймете, что это будет сложнее, чем вы могли бы сразу понять.