It look like the whole method need to synchronized. What if `start` or `stop` are executed between these two lines?
```
  context.data ++= getContextToUpdate(emptyContextToUpdate = true)
  if (hasNext) {
```