Concurrency Coordination Reports
Atomic Claim Coordination Report
Record compare-and-set claims against a single slot and report the contention.
compare-and-set claim
A coordination report can record a single-winner claim. An `java.util.concurrent.atomic.AtomicInteger` starts at zero for unclaimed, and `compareAndSet(0, id)` only succeeds for the first request, which writes its id into the slot; every later request reads a nonzero owner and is rejected. With no requests the slot is open, with one request it is claimed, and with competing requests it is contended. The status line summarizes the outcome and reports the winning owner id.
Atomic Claim Coordination Report
AtomicClaimCoordinationReport.kt
Replay: real traced execution (multi-file project)
import java.util.concurrent.atomic.AtomicInteger
fun main() {
val requests = 1
val slot = AtomicInteger(0)
var claimed = 0
var rejected = 0
for (i in 1..requests) {
if (slot.compareAndSet(0, i)) {
claimed++
} else {
rejected++
}
}
val owner = slot.get()
val status = if (claimed == 0) {
"open"
} else if (rejected > 0) {
"contended"
} else {
"claimed"
}
println("requests=$requests claimed=$claimed rejected=$rejected owner=$owner $status")
}
import java.util.concurrent.atomic.AtomicInteger
fun main() {
val requests = 0
val slot = AtomicInteger(0)
var claimed = 0
var rejected = 0
for (i in 1..requests) {
if (slot.compareAndSet(0, i)) {
claimed++
} else {
rejected++
}
}
val owner = slot.get()
val status = if (claimed == 0) {
"open"
} else if (rejected > 0) {
"contended"
} else {
"claimed"
}
println("requests=$requests claimed=$claimed rejected=$rejected owner=$owner $status")
}
import java.util.concurrent.atomic.AtomicInteger
fun main() {
val requests = 2
val slot = AtomicInteger(0)
var claimed = 0
var rejected = 0
for (i in 1..requests) {
if (slot.compareAndSet(0, i)) {
claimed++
} else {
rejected++
}
}
val owner = slot.get()
val status = if (claimed == 0) {
"open"
} else if (rejected > 0) {
"contended"
} else {
"claimed"
}
println("requests=$requests claimed=$claimed rejected=$rejected owner=$owner $status")
}
requests ← 1, slot ← 0, claimed ← 0, rejected ← 0
3fun main() {4 val requests→ 1 = 1 //@requests=0, 25 val slot→ 0 = AtomicInteger(0)6 var claimed→ 0 = 07 var rejected→ 0 = 0for (i in 1..requests)
9for (i1 in 1..requests1) {10 if (slot.compareAndSet(0, i)) {if (slot.compareAndSet(0, i))
9for (i in 1..requests) {10 if (slot1.compareAndSet(0, i1)) {11 claimed0++12 } else {13 rejected++owner ← 1, status ← claimed
17 val owner→ 1 = slot1.get()1819 val status→ claimed = if (claimed1 == 0) {20 "open"21 } else if (rejected0 > 0) {22 "contended"23 } else {24 "claimed"25 }2627 println("requests=$requests1 claimed=$claimed1 rejected=$rejected0 owner=$owner1 $statusclaimed")28}outputrequests=1 claimed=1 rejected=0 owner=1 claimed
requests ← 0, slot ← 0, claimed ← 0, rejected ← 0, owner ← 0, status ← open
3fun main() {4 val requests→ 0 = 05 val slot→ 0 = AtomicInteger(0)6 var claimed→ 0 = 07 var rejected→ 0 = 089 for (i in 1..requests) {10 if (slot.compareAndSet(0, i)) {11 claimed++12 } else {13 rejected++14 }15 }1617 val owner→ 0 = slot0.get()1819 val status→ open = if (claimed0 == 0) {20 "open"21 } else if (rejected0 > 0) {22 "contended"23 } else {24 "claimed"25 }2627 println("requests=$requests0 claimed=$claimed0 rejected=$rejected0 owner=$owner0 $statusopen")28}outputrequests=0 claimed=0 rejected=0 owner=0 open
requests ← 2, slot ← 0, claimed ← 0, rejected ← 0
3fun main() {4 val requests→ 2 = 25 val slot→ 0 = AtomicInteger(0)6 var claimed→ 0 = 07 var rejected→ 0 = 0for (i in 1..requests)
pass 1 of 29for (i1 in 1..requests2) {10 if (slot.compareAndSet(0, i)) {if (slot.compareAndSet(0, i))
9for (i in 1..requests) {10 if (slot1.compareAndSet(0, i1)) {11 claimed0++12 } else {13 rejected++for (i in 1..requests)
pass 2 of 29for (i2 in 1..requests2) {10 if (slot.compareAndSet(0, i)) {else
11 claimed++12 } else {13 rejected0++14 }15}owner ← 1, status ← contended
17 val owner→ 1 = slot1.get()1819 val status→ contended = if (claimed1 == 0) {20 "open"21 } else if (rejected1 > 0) {22 "contended"23 } else {24 "claimed"25 }2627 println("requests=$requests2 claimed=$claimed1 rejected=$rejected1 owner=$owner1 $statuscontended")28}outputrequests=2 claimed=1 rejected=1 owner=1 contended