저라면 먼저 데이터를 추가하는 부분과 읽어서 처리하는 부분이 데이터를 공유하지 않도록 변경할 것 같습니다.
class SerialDataReceiver: SerialInputOutputManager.Listener {
    interface Listener {
       fun onReceive(data: ByteArray)
    }   
    private val listeners = hashSetOf<SerialDataReceiver.Listener>()
    fun registerListener(listener: SerialInputOut.Listener) {
         listeners.add(listener)
    }
    fun unregisterListener(listener: SerialDataReceiver.Listener) {
          val iterator = listeners.iterator()
          while (iterator.hasNext()) {
              val nextListener = iterator.next()
              if (nextListener == listener) {
                   iterator.remove()
              }
          } 
    }
   override fun onNewData(data: ByteArray) {
        for (listener in listeners) {
            listener.onReceive(data)
        }
    }
}
open class BaseSprayActivity : BaseActivity(), SerialDataReceiver.Listener {
   private val serialDataReceiver = SerialDataReceiver()
   @Override
   fun onResume() {
      super.onResume()
      serialDataReceiver.registerListener(this)
   }
   
   @Override
   fun onStop(...) {
      super.onStop(...)
      serialDataReceiver.unregisterListener(this)
   }
   override fun onReceive(data: ByteArray) {
         // 필요한 처리
    }
} 
만약 위처럼 변수를 공유하지 않고 콜백 내에서 처리하기 곤란하다면, thread 에 안전한 ArrayBlockingQueue나 LinkedBlockginQueue 등과 같은 클래스를 사용하시는 게 나을 듯 합니다.