Ну, один из вариантов - это где-то пакетировать изменения перед применением пакета к защищенному ресурсу.
Например, каждый поток собирает десять фрагментов информации (или меньше)если он закончится до того, как соберет десять), тогда измените Foo
, чтобы взять длину и массив - таким образом, вы амортизируете стоимость блокировки, делая ее намного более эффективной.
Я также был бы оченьОсторожно:
// do quick assignment operation. array[currentCount] = something
за пределами защищенной зоны - это рецепт катастрофы, поскольку другой поток может изменить currentCount
из-под вас.Это не проблема, если это локальная переменная, поскольку каждый поток будет иметь свою собственную копию, но из кода не ясно, какая область имеет эту переменную.