Я только что проверил это с Kotlin сопрограммами на Android, используя следующий код
val incrementalNum = AtomicInteger(0)
val map = ConcurrentHashMap<Int, Unit>()
val lastThreadNum = AtomicInteger(-1)
val collisions = AtomicInteger(0)
for (a in 0..1000) GlobalScope.launch {
val threadNum = incrementalNum.incrementAndGet()
map.compute(threadNum) { k, v-> lastThreadNum.set(threadNum); Unit.apply {
Log.e("SLOW", "this operation will slow things")
if (lastThreadNum.get() != threadNum) Log.e("COLLISION", "Collision Number: ${collisions.incrementAndGet()}")
}}
}
С map.compute (threadNum) я получаю достаточное количество коллизий (около 10-30) каждый Когда я запускаю его, при использовании map.compute (1) я никогда не получаю никаких коллизий.
Это, кажется, указывает на то, что - по крайней мере на Android - функция ConcurrentHashMap.compute блокируется только ключом (который это довольно хорошее поведение для моего варианта использования)
Я попытаюсь проверить это с другими Java реализациями, если это стандартная / обычная реализация, вероятно, ее лучше документировать