| // !LANGUAGE: +PolymorphicSignature |
| // 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" |
| } |