Ваш readRecord
синхронизирован, поэтому одновременно может быть не более одного readRecord
, но ничто не мешает одновременной работе readRecord
и writeRecord
, поскольку они блокируются на разных объектах. Если так случится, что writeRecord
находится в процессе добавления записи, поэтому isEmpty
возвращает false, но removeFirst
не может найти элемент, потому что writeRecord
еще не добавил его, вы получите это исключение.
Синхронизируйте на listLock
в readRecord
или избавьтесь от listLock
и объявите оба метода синхронизированными, чтобы исправить это.