Closed
Description
Compiler version
3.2.2
Minimized code
https://github.com/mohe2015/coverage-synchronized-bug
scala -coverage-out coverage src/main/scala/Main.scala
import concurrent.ExecutionContext.Implicits.global
import scala.concurrent.*
import scala.concurrent.duration.*
var test = 0
def brokenSynchronizedBlock(option: Boolean): Future[Unit] = Future {
if (option) {
Thread.sleep(500)
}
synchronized {
val tmp = test
Thread.sleep(1000)
test = tmp + 1
}
}
@main def main: Unit = {
Await.result(Future.sequence(Seq(brokenSynchronizedBlock(false), brokenSynchronizedBlock(true))).map(result => {
println(test)
assert(test == 2)
}), 3.seconds)
}
Output
1
java.util.concurrent.ExecutionException: Boxed Exception
at scala.concurrent.impl.Promise$.scala$concurrent$impl$Promise$$resolve(Promise.scala:99)
at scala.concurrent.impl.Promise$Transformation.handleFailure(Promise.scala:444)
at scala.concurrent.impl.Promise$Transformation.run(Promise.scala:506)
at java.base/java.util.concurrent.ForkJoinTask$RunnableExecuteAction.exec(ForkJoinTask.java:1395)
at java.base/java.util.concurrent.ForkJoinTask.doExec(ForkJoinTask.java:373)
at java.base/java.util.concurrent.ForkJoinPool$WorkQueue.topLevelExec(ForkJoinPool.java:1182)
at java.base/java.util.concurrent.ForkJoinPool.scan(ForkJoinPool.java:1655)
at java.base/java.util.concurrent.ForkJoinPool.runWorker(ForkJoinPool.java:1622)
at java.base/java.util.concurrent.ForkJoinWorkerThread.run(ForkJoinWorkerThread.java:165)
Caused by: java.lang.AssertionError: assertion failed
at scala.runtime.Scala3RunTime$.assertFailed(Scala3RunTime.scala:11)
at Main$package$.$anonfun$1(Main.scala:21)
at scala.runtime.function.JProcedure1.apply(JProcedure1.java:15)
at scala.runtime.function.JProcedure1.apply(JProcedure1.java:10)
at scala.concurrent.impl.Promise$Transformation.run(Promise.scala:467)
... 6 more
Expectation
2