| // TARGET_BACKEND: JVM | |
| // SKIP_JDK6 | |
| // WITH_STDLIB | |
| import java.lang.invoke.MethodHandles | |
| import kotlin.concurrent.thread | |
| fun box(): String { | |
| val handle = MethodHandles.arrayElementVarHandle(ByteArray::class.java) | |
| val array = ByteArray(10) | |
| val index = 0 | |
| // Check that we don't consider non-Object return type of a signature-polymorphic method to be polymorphic. | |
| handle.weakCompareAndSetPlain(array, index, 0.toByte(), 21.toByte()) as Comparable<*> | |
| val oldValue = 42.toByte() | |
| val newValue = (-74).toByte() | |
| thread { | |
| Thread.sleep(400L) | |
| handle.setVolatile(array, index, oldValue) | |
| } | |
| while (!handle.compareAndSet(array, index, oldValue, newValue)) { | |
| Thread.sleep(10L) | |
| } | |
| return if (handle.getVolatile(array, index) == newValue) "OK" else "Fail" | |
| } |