1 /*
2 * Copyright (c) 2015, 2025, Oracle and/or its affiliates. All rights reserved.
3 * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
4 *
5 * This code is free software; you can redistribute it and/or modify it
6 * under the terms of the GNU General Public License version 2 only, as
7 * published by the Free Software Foundation.
8 *
9 * This code is distributed in the hope that it will be useful, but WITHOUT
10 * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
11 * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License
12 * version 2 for more details (a copy is included in the LICENSE file that
13 * accompanied this code).
14 *
15 * You should have received a copy of the GNU General Public License version
16 * 2 along with this work; if not, write to the Free Software Foundation,
17 * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA.
18 *
19 * Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA
20 * or visit www.oracle.com if you need additional information or have any
21 * questions.
22 */
23
24 /*
25 * @test
26 * @run junit/othervm -Diters=10 -Xint VarHandleTestAccessDouble
27 *
28 * @comment Set CompileThresholdScaling to 0.1 so that the warmup loop sets to 2000 iterations
29 * to hit compilation thresholds
30 *
31 * @run junit/othervm -Diters=2000 -XX:CompileThresholdScaling=0.1 -XX:TieredStopAtLevel=1 VarHandleTestAccessDouble
32 * @run junit/othervm -Diters=2000 -XX:CompileThresholdScaling=0.1 VarHandleTestAccessDouble
33 * @run junit/othervm -Diters=2000 -XX:CompileThresholdScaling=0.1 -XX:-TieredCompilation VarHandleTestAccessDouble
34 */
35
36 import java.lang.invoke.MethodHandles;
37 import java.lang.invoke.VarHandle;
38 import java.util.ArrayList;
39 import java.util.Arrays;
40 import java.util.List;
41
42 import static org.junit.jupiter.api.Assertions.*;
43 import org.junit.jupiter.api.BeforeAll;
44 import org.junit.jupiter.api.Test;
45 import org.junit.jupiter.api.TestInstance;
46 import org.junit.jupiter.params.ParameterizedTest;
47 import org.junit.jupiter.params.provider.MethodSource;
48
49 @TestInstance(TestInstance.Lifecycle.PER_CLASS)
50 public class VarHandleTestAccessDouble extends VarHandleBaseTest {
51 static final double static_final_v = 1.0d;
52
53 static double static_v;
54
55 final double final_v = 1.0d;
56
57 double v;
58
59 static final double static_final_v2 = 1.0d;
60
61 static double static_v2;
62
63 final double final_v2 = 1.0d;
64
65 double v2;
66
67 VarHandle vhFinalField;
68
69 VarHandle vhField;
70
71 VarHandle vhStaticField;
72
73 VarHandle vhStaticFinalField;
74
75 VarHandle vhArray;
76
77
78 VarHandle[] allocate(boolean same) {
79 List<VarHandle> vhs = new ArrayList<>();
80
81 String postfix = same ? "" : "2";
82 VarHandle vh;
83 try {
84 vh = MethodHandles.lookup().findVarHandle(
85 VarHandleTestAccessDouble.class, "final_v" + postfix, double.class);
86 vhs.add(vh);
87
88 vh = MethodHandles.lookup().findVarHandle(
89 VarHandleTestAccessDouble.class, "v" + postfix, double.class);
90 vhs.add(vh);
91
92 vh = MethodHandles.lookup().findStaticVarHandle(
93 VarHandleTestAccessDouble.class, "static_final_v" + postfix, double.class);
94 vhs.add(vh);
95
96 vh = MethodHandles.lookup().findStaticVarHandle(
97 VarHandleTestAccessDouble.class, "static_v" + postfix, double.class);
98 vhs.add(vh);
99
100 if (same) {
101 vh = MethodHandles.arrayElementVarHandle(double[].class);
102 }
103 else {
104 vh = MethodHandles.arrayElementVarHandle(String[].class);
105 }
106 vhs.add(vh);
107 } catch (Exception e) {
108 throw new InternalError(e);
109 }
110 return vhs.toArray(new VarHandle[0]);
111 }
112
113 @BeforeAll
114 public void setup() throws Exception {
115 vhFinalField = MethodHandles.lookup().findVarHandle(
116 VarHandleTestAccessDouble.class, "final_v", double.class);
117
118 vhField = MethodHandles.lookup().findVarHandle(
119 VarHandleTestAccessDouble.class, "v", double.class);
120
121 vhStaticFinalField = MethodHandles.lookup().findStaticVarHandle(
122 VarHandleTestAccessDouble.class, "static_final_v", double.class);
123
124 vhStaticField = MethodHandles.lookup().findStaticVarHandle(
125 VarHandleTestAccessDouble.class, "static_v", double.class);
126
127 vhArray = MethodHandles.arrayElementVarHandle(double[].class);
128 }
129
130 public Object[][] varHandlesProvider() throws Exception {
131 List<VarHandle> vhs = new ArrayList<>();
132 vhs.add(vhField);
133 vhs.add(vhStaticField);
134 vhs.add(vhArray);
135
136 return vhs.stream().map(tc -> new Object[]{tc}).toArray(Object[][]::new);
137 }
138
139 @Test
140 public void testEquals() {
141 VarHandle[] vhs1 = allocate(true);
142 VarHandle[] vhs2 = allocate(true);
143
144 for (int i = 0; i < vhs1.length; i++) {
145 for (int j = 0; j < vhs1.length; j++) {
146 if (i != j) {
147 assertNotEquals(vhs1[i], vhs1[j]);
148 assertNotEquals(vhs1[i], vhs2[j]);
149 }
150 }
151 }
152
153 VarHandle[] vhs3 = allocate(false);
154 for (int i = 0; i < vhs1.length; i++) {
155 assertNotEquals(vhs1[i], vhs3[i]);
156 }
157 }
158
159 @ParameterizedTest
160 @MethodSource("varHandlesProvider")
161 public void testIsAccessModeSupported(VarHandle vh) {
162 assertTrue(vh.isAccessModeSupported(VarHandle.AccessMode.GET));
163 assertTrue(vh.isAccessModeSupported(VarHandle.AccessMode.SET));
164 assertTrue(vh.isAccessModeSupported(VarHandle.AccessMode.GET_VOLATILE));
165 assertTrue(vh.isAccessModeSupported(VarHandle.AccessMode.SET_VOLATILE));
166 assertTrue(vh.isAccessModeSupported(VarHandle.AccessMode.GET_ACQUIRE));
167 assertTrue(vh.isAccessModeSupported(VarHandle.AccessMode.SET_RELEASE));
168 assertTrue(vh.isAccessModeSupported(VarHandle.AccessMode.GET_OPAQUE));
169 assertTrue(vh.isAccessModeSupported(VarHandle.AccessMode.SET_OPAQUE));
170
171 assertTrue(vh.isAccessModeSupported(VarHandle.AccessMode.COMPARE_AND_SET));
172 assertTrue(vh.isAccessModeSupported(VarHandle.AccessMode.COMPARE_AND_EXCHANGE));
173 assertTrue(vh.isAccessModeSupported(VarHandle.AccessMode.COMPARE_AND_EXCHANGE_ACQUIRE));
174 assertTrue(vh.isAccessModeSupported(VarHandle.AccessMode.COMPARE_AND_EXCHANGE_RELEASE));
175 assertTrue(vh.isAccessModeSupported(VarHandle.AccessMode.WEAK_COMPARE_AND_SET_PLAIN));
176 assertTrue(vh.isAccessModeSupported(VarHandle.AccessMode.WEAK_COMPARE_AND_SET));
177 assertTrue(vh.isAccessModeSupported(VarHandle.AccessMode.WEAK_COMPARE_AND_SET_ACQUIRE));
178 assertTrue(vh.isAccessModeSupported(VarHandle.AccessMode.WEAK_COMPARE_AND_SET_RELEASE));
179 assertTrue(vh.isAccessModeSupported(VarHandle.AccessMode.GET_AND_SET));
180 assertTrue(vh.isAccessModeSupported(VarHandle.AccessMode.GET_AND_SET_ACQUIRE));
181 assertTrue(vh.isAccessModeSupported(VarHandle.AccessMode.GET_AND_SET_RELEASE));
182
183 assertTrue(vh.isAccessModeSupported(VarHandle.AccessMode.GET_AND_ADD));
184 assertTrue(vh.isAccessModeSupported(VarHandle.AccessMode.GET_AND_ADD_ACQUIRE));
185 assertTrue(vh.isAccessModeSupported(VarHandle.AccessMode.GET_AND_ADD_RELEASE));
186
187 assertFalse(vh.isAccessModeSupported(VarHandle.AccessMode.GET_AND_BITWISE_OR));
188 assertFalse(vh.isAccessModeSupported(VarHandle.AccessMode.GET_AND_BITWISE_OR_ACQUIRE));
189 assertFalse(vh.isAccessModeSupported(VarHandle.AccessMode.GET_AND_BITWISE_OR_RELEASE));
190 assertFalse(vh.isAccessModeSupported(VarHandle.AccessMode.GET_AND_BITWISE_AND));
191 assertFalse(vh.isAccessModeSupported(VarHandle.AccessMode.GET_AND_BITWISE_AND_ACQUIRE));
192 assertFalse(vh.isAccessModeSupported(VarHandle.AccessMode.GET_AND_BITWISE_AND_RELEASE));
193 assertFalse(vh.isAccessModeSupported(VarHandle.AccessMode.GET_AND_BITWISE_XOR));
194 assertFalse(vh.isAccessModeSupported(VarHandle.AccessMode.GET_AND_BITWISE_XOR_ACQUIRE));
195 assertFalse(vh.isAccessModeSupported(VarHandle.AccessMode.GET_AND_BITWISE_XOR_RELEASE));
196 }
197
198 public Object[][] typesProvider() throws Exception {
199 List<Object[]> types = new ArrayList<>();
200 types.add(new Object[] {vhField, Arrays.asList(VarHandleTestAccessDouble.class)});
201 types.add(new Object[] {vhStaticField, Arrays.asList()});
202 types.add(new Object[] {vhArray, Arrays.asList(double[].class, int.class)});
203
204 return types.stream().toArray(Object[][]::new);
205 }
206
207 @ParameterizedTest
208 @MethodSource("typesProvider")
209 public void testTypes(VarHandle vh, List<Class<?>> pts) {
210 assertEquals(double.class, vh.varType());
211
212 assertEquals(pts, vh.coordinateTypes());
213
214 testTypes(vh);
215 }
216
217 @Test
218 public void testLookupInstanceToStatic() {
219 checkIAE("Lookup of static final field to instance final field", () -> {
220 MethodHandles.lookup().findStaticVarHandle(
221 VarHandleTestAccessDouble.class, "final_v", double.class);
222 });
223
224 checkIAE("Lookup of static field to instance field", () -> {
225 MethodHandles.lookup().findStaticVarHandle(
226 VarHandleTestAccessDouble.class, "v", double.class);
227 });
228 }
229
230 @Test
231 public void testLookupStaticToInstance() {
232 checkIAE("Lookup of instance final field to static final field", () -> {
233 MethodHandles.lookup().findVarHandle(
234 VarHandleTestAccessDouble.class, "static_final_v", double.class);
235 });
236
237 checkIAE("Lookup of instance field to static field", () -> {
238 vhStaticField = MethodHandles.lookup().findVarHandle(
239 VarHandleTestAccessDouble.class, "static_v", double.class);
240 });
241 }
242
243 public Object[][] accessTestCaseProvider() throws Exception {
244 List<AccessTestCase<?>> cases = new ArrayList<>();
245
246 cases.add(new VarHandleAccessTestCase("Instance final field",
247 vhFinalField, vh -> testInstanceFinalField(this, vh)));
248 cases.add(new VarHandleAccessTestCase("Instance final field unsupported",
249 vhFinalField, vh -> testInstanceFinalFieldUnsupported(this, vh),
250 false));
251
252 cases.add(new VarHandleAccessTestCase("Static final field",
253 vhStaticFinalField, VarHandleTestAccessDouble::testStaticFinalField));
254 cases.add(new VarHandleAccessTestCase("Static final field unsupported",
255 vhStaticFinalField, VarHandleTestAccessDouble::testStaticFinalFieldUnsupported,
256 false));
257
258 cases.add(new VarHandleAccessTestCase("Instance field",
259 vhField, vh -> testInstanceField(this, vh)));
260 cases.add(new VarHandleAccessTestCase("Instance field unsupported",
261 vhField, vh -> testInstanceFieldUnsupported(this, vh),
262 false));
263
264 cases.add(new VarHandleAccessTestCase("Static field",
265 vhStaticField, VarHandleTestAccessDouble::testStaticField));
266 cases.add(new VarHandleAccessTestCase("Static field unsupported",
267 vhStaticField, VarHandleTestAccessDouble::testStaticFieldUnsupported,
268 false));
269
270 cases.add(new VarHandleAccessTestCase("Array",
271 vhArray, VarHandleTestAccessDouble::testArray));
272 cases.add(new VarHandleAccessTestCase("Array unsupported",
273 vhArray, VarHandleTestAccessDouble::testArrayUnsupported,
274 false));
275 cases.add(new VarHandleAccessTestCase("Array index out of bounds",
276 vhArray, VarHandleTestAccessDouble::testArrayIndexOutOfBounds,
277 false));
278 // Work around issue with jtreg summary reporting which truncates
279 // the String result of Object.toString to 30 characters, hence
280 // the first dummy argument
281 return cases.stream().map(tc -> new Object[]{tc.toString(), tc}).toArray(Object[][]::new);
282 }
283
284 @ParameterizedTest
285 @MethodSource("accessTestCaseProvider")
286 public <T> void testAccess(String desc, AccessTestCase<T> atc) throws Throwable {
287 T t = atc.get();
288 int iters = atc.requiresLoop() ? ITERS : 1;
289 for (int c = 0; c < iters; c++) {
290 atc.testAccess(t);
291 }
292 }
293
294 static void testInstanceFinalField(VarHandleTestAccessDouble recv, VarHandle vh) {
295 // Plain
296 {
297 double x = (double) vh.get(recv);
298 assertEquals(1.0d, x, "get double value");
299 }
300
301
302 // Volatile
303 {
304 double x = (double) vh.getVolatile(recv);
305 assertEquals(1.0d, x, "getVolatile double value");
306 }
307
308 // Lazy
309 {
310 double x = (double) vh.getAcquire(recv);
311 assertEquals(1.0d, x, "getRelease double value");
312 }
313
314 // Opaque
315 {
316 double x = (double) vh.getOpaque(recv);
317 assertEquals(1.0d, x, "getOpaque double value");
318 }
319 }
320
321 static void testInstanceFinalFieldUnsupported(VarHandleTestAccessDouble recv, VarHandle vh) {
322 checkUOE(() -> {
323 vh.set(recv, 2.0d);
324 });
325
326 checkUOE(() -> {
327 vh.setVolatile(recv, 2.0d);
328 });
329
330 checkUOE(() -> {
331 vh.setRelease(recv, 2.0d);
332 });
333
334 checkUOE(() -> {
335 vh.setOpaque(recv, 2.0d);
336 });
337
338
339
340 checkUOE(() -> {
341 double o = (double) vh.getAndBitwiseOr(recv, 1.0d);
342 });
343
344 checkUOE(() -> {
345 double o = (double) vh.getAndBitwiseOrAcquire(recv, 1.0d);
346 });
347
348 checkUOE(() -> {
349 double o = (double) vh.getAndBitwiseOrRelease(recv, 1.0d);
350 });
351
352 checkUOE(() -> {
353 double o = (double) vh.getAndBitwiseAnd(recv, 1.0d);
354 });
355
356 checkUOE(() -> {
357 double o = (double) vh.getAndBitwiseAndAcquire(recv, 1.0d);
358 });
359
360 checkUOE(() -> {
361 double o = (double) vh.getAndBitwiseAndRelease(recv, 1.0d);
362 });
363
364 checkUOE(() -> {
365 double o = (double) vh.getAndBitwiseXor(recv, 1.0d);
366 });
367
368 checkUOE(() -> {
369 double o = (double) vh.getAndBitwiseXorAcquire(recv, 1.0d);
370 });
371
372 checkUOE(() -> {
373 double o = (double) vh.getAndBitwiseXorRelease(recv, 1.0d);
374 });
375 }
376
377
378 static void testStaticFinalField(VarHandle vh) {
379 // Plain
380 {
381 double x = (double) vh.get();
382 assertEquals(1.0d, x, "get double value");
383 }
384
385
386 // Volatile
387 {
388 double x = (double) vh.getVolatile();
389 assertEquals(1.0d, x, "getVolatile double value");
390 }
391
392 // Lazy
393 {
394 double x = (double) vh.getAcquire();
395 assertEquals(1.0d, x, "getRelease double value");
396 }
397
398 // Opaque
399 {
400 double x = (double) vh.getOpaque();
401 assertEquals(1.0d, x, "getOpaque double value");
402 }
403 }
404
405 static void testStaticFinalFieldUnsupported(VarHandle vh) {
406 checkUOE(() -> {
407 vh.set(2.0d);
408 });
409
410 checkUOE(() -> {
411 vh.setVolatile(2.0d);
412 });
413
414 checkUOE(() -> {
415 vh.setRelease(2.0d);
416 });
417
418 checkUOE(() -> {
419 vh.setOpaque(2.0d);
420 });
421
422
423
424 checkUOE(() -> {
425 double o = (double) vh.getAndBitwiseOr(1.0d);
426 });
427
428 checkUOE(() -> {
429 double o = (double) vh.getAndBitwiseOrAcquire(1.0d);
430 });
431
432 checkUOE(() -> {
433 double o = (double) vh.getAndBitwiseOrRelease(1.0d);
434 });
435
436 checkUOE(() -> {
437 double o = (double) vh.getAndBitwiseAnd(1.0d);
438 });
439
440 checkUOE(() -> {
441 double o = (double) vh.getAndBitwiseAndAcquire(1.0d);
442 });
443
444 checkUOE(() -> {
445 double o = (double) vh.getAndBitwiseAndRelease(1.0d);
446 });
447
448 checkUOE(() -> {
449 double o = (double) vh.getAndBitwiseXor(1.0d);
450 });
451
452 checkUOE(() -> {
453 double o = (double) vh.getAndBitwiseXorAcquire(1.0d);
454 });
455
456 checkUOE(() -> {
457 double o = (double) vh.getAndBitwiseXorRelease(1.0d);
458 });
459 }
460
461
462 static void testInstanceField(VarHandleTestAccessDouble recv, VarHandle vh) {
463 // Plain
464 {
465 vh.set(recv, 1.0d);
466 double x = (double) vh.get(recv);
467 assertEquals(1.0d, x, "set double value");
468 }
469
470
471 // Volatile
472 {
473 vh.setVolatile(recv, 2.0d);
474 double x = (double) vh.getVolatile(recv);
475 assertEquals(2.0d, x, "setVolatile double value");
476 }
477
478 // Lazy
479 {
480 vh.setRelease(recv, 1.0d);
481 double x = (double) vh.getAcquire(recv);
482 assertEquals(1.0d, x, "setRelease double value");
483 }
484
485 // Opaque
486 {
487 vh.setOpaque(recv, 2.0d);
488 double x = (double) vh.getOpaque(recv);
489 assertEquals(2.0d, x, "setOpaque double value");
490 }
491
492 vh.set(recv, 1.0d);
493
494 // Compare
495 {
496 boolean r = vh.compareAndSet(recv, 1.0d, 2.0d);
497 assertEquals(r, true, "success compareAndSet double");
498 double x = (double) vh.get(recv);
499 assertEquals(2.0d, x, "success compareAndSet double value");
500 }
501
502 {
503 boolean r = vh.compareAndSet(recv, 1.0d, 3.0d);
504 assertEquals(r, false, "failing compareAndSet double");
505 double x = (double) vh.get(recv);
506 assertEquals(2.0d, x, "failing compareAndSet double value");
507 }
508
509 {
510 double r = (double) vh.compareAndExchange(recv, 2.0d, 1.0d);
511 assertEquals(r, 2.0d, "success compareAndExchange double");
512 double x = (double) vh.get(recv);
513 assertEquals(1.0d, x, "success compareAndExchange double value");
514 }
515
516 {
517 double r = (double) vh.compareAndExchange(recv, 2.0d, 3.0d);
518 assertEquals(r, 1.0d, "failing compareAndExchange double");
519 double x = (double) vh.get(recv);
520 assertEquals(1.0d, x, "failing compareAndExchange double value");
521 }
522
523 {
524 double r = (double) vh.compareAndExchangeAcquire(recv, 1.0d, 2.0d);
525 assertEquals(r, 1.0d, "success compareAndExchangeAcquire double");
526 double x = (double) vh.get(recv);
527 assertEquals(2.0d, x, "success compareAndExchangeAcquire double value");
528 }
529
530 {
531 double r = (double) vh.compareAndExchangeAcquire(recv, 1.0d, 3.0d);
532 assertEquals(r, 2.0d, "failing compareAndExchangeAcquire double");
533 double x = (double) vh.get(recv);
534 assertEquals(2.0d, x, "failing compareAndExchangeAcquire double value");
535 }
536
537 {
538 double r = (double) vh.compareAndExchangeRelease(recv, 2.0d, 1.0d);
539 assertEquals(r, 2.0d, "success compareAndExchangeRelease double");
540 double x = (double) vh.get(recv);
541 assertEquals(1.0d, x, "success compareAndExchangeRelease double value");
542 }
543
544 {
545 double r = (double) vh.compareAndExchangeRelease(recv, 2.0d, 3.0d);
546 assertEquals(r, 1.0d, "failing compareAndExchangeRelease double");
547 double x = (double) vh.get(recv);
548 assertEquals(1.0d, x, "failing compareAndExchangeRelease double value");
549 }
550
551 {
552 boolean success = false;
553 for (int c = 0; c < WEAK_ATTEMPTS && !success; c++) {
554 success = vh.weakCompareAndSetPlain(recv, 1.0d, 2.0d);
555 if (!success) weakDelay();
556 }
557 assertEquals(success, true, "success weakCompareAndSetPlain double");
558 double x = (double) vh.get(recv);
559 assertEquals(2.0d, x, "success weakCompareAndSetPlain double value");
560 }
561
562 {
563 boolean success = vh.weakCompareAndSetPlain(recv, 1.0d, 3.0d);
564 assertEquals(success, false, "failing weakCompareAndSetPlain double");
565 double x = (double) vh.get(recv);
566 assertEquals(2.0d, x, "failing weakCompareAndSetPlain double value");
567 }
568
569 {
570 boolean success = false;
571 for (int c = 0; c < WEAK_ATTEMPTS && !success; c++) {
572 success = vh.weakCompareAndSetAcquire(recv, 2.0d, 1.0d);
573 if (!success) weakDelay();
574 }
575 assertEquals(success, true, "success weakCompareAndSetAcquire double");
576 double x = (double) vh.get(recv);
577 assertEquals(1.0d, x, "success weakCompareAndSetAcquire double");
578 }
579
580 {
581 boolean success = vh.weakCompareAndSetAcquire(recv, 2.0d, 3.0d);
582 assertEquals(success, false, "failing weakCompareAndSetAcquire double");
583 double x = (double) vh.get(recv);
584 assertEquals(1.0d, x, "failing weakCompareAndSetAcquire double value");
585 }
586
587 {
588 boolean success = false;
589 for (int c = 0; c < WEAK_ATTEMPTS && !success; c++) {
590 success = vh.weakCompareAndSetRelease(recv, 1.0d, 2.0d);
591 if (!success) weakDelay();
592 }
593 assertEquals(success, true, "success weakCompareAndSetRelease double");
594 double x = (double) vh.get(recv);
595 assertEquals(2.0d, x, "success weakCompareAndSetRelease double");
596 }
597
598 {
599 boolean success = vh.weakCompareAndSetRelease(recv, 1.0d, 3.0d);
600 assertEquals(success, false, "failing weakCompareAndSetRelease double");
601 double x = (double) vh.get(recv);
602 assertEquals(2.0d, x, "failing weakCompareAndSetRelease double value");
603 }
604
605 {
606 boolean success = false;
607 for (int c = 0; c < WEAK_ATTEMPTS && !success; c++) {
608 success = vh.weakCompareAndSet(recv, 2.0d, 1.0d);
609 if (!success) weakDelay();
610 }
611 assertEquals(success, true, "success weakCompareAndSet double");
612 double x = (double) vh.get(recv);
613 assertEquals(1.0d, x, "success weakCompareAndSet double value");
614 }
615
616 {
617 boolean success = vh.weakCompareAndSet(recv, 2.0d, 3.0d);
618 assertEquals(success, false, "failing weakCompareAndSet double");
619 double x = (double) vh.get(recv);
620 assertEquals(1.0d, x, "failing weakCompareAndSet double value");
621 }
622
623 // Compare set and get
624 {
625 vh.set(recv, 1.0d);
626
627 double o = (double) vh.getAndSet(recv, 2.0d);
628 assertEquals(1.0d, o, "getAndSet double");
629 double x = (double) vh.get(recv);
630 assertEquals(2.0d, x, "getAndSet double value");
631 }
632
633 {
634 vh.set(recv, 1.0d);
635
636 double o = (double) vh.getAndSetAcquire(recv, 2.0d);
637 assertEquals(1.0d, o, "getAndSetAcquire double");
638 double x = (double) vh.get(recv);
639 assertEquals(2.0d, x, "getAndSetAcquire double value");
640 }
641
642 {
643 vh.set(recv, 1.0d);
644
645 double o = (double) vh.getAndSetRelease(recv, 2.0d);
646 assertEquals(1.0d, o, "getAndSetRelease double");
647 double x = (double) vh.get(recv);
648 assertEquals(2.0d, x, "getAndSetRelease double value");
649 }
650
651 // get and add, add and get
652 {
653 vh.set(recv, 1.0d);
654
655 double o = (double) vh.getAndAdd(recv, 2.0d);
656 assertEquals(1.0d, o, "getAndAdd double");
657 double x = (double) vh.get(recv);
658 assertEquals((double)(1.0d + 2.0d), x, "getAndAdd double value");
659 }
660
661 {
662 vh.set(recv, 1.0d);
663
664 double o = (double) vh.getAndAddAcquire(recv, 2.0d);
665 assertEquals(1.0d, o, "getAndAddAcquire double");
666 double x = (double) vh.get(recv);
667 assertEquals((double)(1.0d + 2.0d), x, "getAndAddAcquire double value");
668 }
669
670 {
671 vh.set(recv, 1.0d);
672
673 double o = (double) vh.getAndAddRelease(recv, 2.0d);
674 assertEquals(1.0d, o, "getAndAddReleasedouble");
675 double x = (double) vh.get(recv);
676 assertEquals((double)(1.0d + 2.0d), x, "getAndAddRelease double value");
677 }
678
679 }
680
681 static void testInstanceFieldUnsupported(VarHandleTestAccessDouble recv, VarHandle vh) {
682
683
684 checkUOE(() -> {
685 double o = (double) vh.getAndBitwiseOr(recv, 1.0d);
686 });
687
688 checkUOE(() -> {
689 double o = (double) vh.getAndBitwiseOrAcquire(recv, 1.0d);
690 });
691
692 checkUOE(() -> {
693 double o = (double) vh.getAndBitwiseOrRelease(recv, 1.0d);
694 });
695
696 checkUOE(() -> {
697 double o = (double) vh.getAndBitwiseAnd(recv, 1.0d);
698 });
699
700 checkUOE(() -> {
701 double o = (double) vh.getAndBitwiseAndAcquire(recv, 1.0d);
702 });
703
704 checkUOE(() -> {
705 double o = (double) vh.getAndBitwiseAndRelease(recv, 1.0d);
706 });
707
708 checkUOE(() -> {
709 double o = (double) vh.getAndBitwiseXor(recv, 1.0d);
710 });
711
712 checkUOE(() -> {
713 double o = (double) vh.getAndBitwiseXorAcquire(recv, 1.0d);
714 });
715
716 checkUOE(() -> {
717 double o = (double) vh.getAndBitwiseXorRelease(recv, 1.0d);
718 });
719 }
720
721
722 static void testStaticField(VarHandle vh) {
723 // Plain
724 {
725 vh.set(1.0d);
726 double x = (double) vh.get();
727 assertEquals(1.0d, x, "set double value");
728 }
729
730
731 // Volatile
732 {
733 vh.setVolatile(2.0d);
734 double x = (double) vh.getVolatile();
735 assertEquals(2.0d, x, "setVolatile double value");
736 }
737
738 // Lazy
739 {
740 vh.setRelease(1.0d);
741 double x = (double) vh.getAcquire();
742 assertEquals(1.0d, x, "setRelease double value");
743 }
744
745 // Opaque
746 {
747 vh.setOpaque(2.0d);
748 double x = (double) vh.getOpaque();
749 assertEquals(2.0d, x, "setOpaque double value");
750 }
751
752 vh.set(1.0d);
753
754 // Compare
755 {
756 boolean r = vh.compareAndSet(1.0d, 2.0d);
757 assertEquals(r, true, "success compareAndSet double");
758 double x = (double) vh.get();
759 assertEquals(2.0d, x, "success compareAndSet double value");
760 }
761
762 {
763 boolean r = vh.compareAndSet(1.0d, 3.0d);
764 assertEquals(r, false, "failing compareAndSet double");
765 double x = (double) vh.get();
766 assertEquals(2.0d, x, "failing compareAndSet double value");
767 }
768
769 {
770 double r = (double) vh.compareAndExchange(2.0d, 1.0d);
771 assertEquals(r, 2.0d, "success compareAndExchange double");
772 double x = (double) vh.get();
773 assertEquals(1.0d, x, "success compareAndExchange double value");
774 }
775
776 {
777 double r = (double) vh.compareAndExchange(2.0d, 3.0d);
778 assertEquals(r, 1.0d, "failing compareAndExchange double");
779 double x = (double) vh.get();
780 assertEquals(1.0d, x, "failing compareAndExchange double value");
781 }
782
783 {
784 double r = (double) vh.compareAndExchangeAcquire(1.0d, 2.0d);
785 assertEquals(r, 1.0d, "success compareAndExchangeAcquire double");
786 double x = (double) vh.get();
787 assertEquals(2.0d, x, "success compareAndExchangeAcquire double value");
788 }
789
790 {
791 double r = (double) vh.compareAndExchangeAcquire(1.0d, 3.0d);
792 assertEquals(r, 2.0d, "failing compareAndExchangeAcquire double");
793 double x = (double) vh.get();
794 assertEquals(2.0d, x, "failing compareAndExchangeAcquire double value");
795 }
796
797 {
798 double r = (double) vh.compareAndExchangeRelease(2.0d, 1.0d);
799 assertEquals(r, 2.0d, "success compareAndExchangeRelease double");
800 double x = (double) vh.get();
801 assertEquals(1.0d, x, "success compareAndExchangeRelease double value");
802 }
803
804 {
805 double r = (double) vh.compareAndExchangeRelease(2.0d, 3.0d);
806 assertEquals(r, 1.0d, "failing compareAndExchangeRelease double");
807 double x = (double) vh.get();
808 assertEquals(1.0d, x, "failing compareAndExchangeRelease double value");
809 }
810
811 {
812 boolean success = false;
813 for (int c = 0; c < WEAK_ATTEMPTS && !success; c++) {
814 success = vh.weakCompareAndSetPlain(1.0d, 2.0d);
815 if (!success) weakDelay();
816 }
817 assertEquals(success, true, "success weakCompareAndSetPlain double");
818 double x = (double) vh.get();
819 assertEquals(2.0d, x, "success weakCompareAndSetPlain double value");
820 }
821
822 {
823 boolean success = vh.weakCompareAndSetPlain(1.0d, 3.0d);
824 assertEquals(success, false, "failing weakCompareAndSetPlain double");
825 double x = (double) vh.get();
826 assertEquals(2.0d, x, "failing weakCompareAndSetPlain double value");
827 }
828
829 {
830 boolean success = false;
831 for (int c = 0; c < WEAK_ATTEMPTS && !success; c++) {
832 success = vh.weakCompareAndSetAcquire(2.0d, 1.0d);
833 if (!success) weakDelay();
834 }
835 assertEquals(success, true, "success weakCompareAndSetAcquire double");
836 double x = (double) vh.get();
837 assertEquals(1.0d, x, "success weakCompareAndSetAcquire double");
838 }
839
840 {
841 boolean success = vh.weakCompareAndSetAcquire(2.0d, 3.0d);
842 assertEquals(success, false, "failing weakCompareAndSetAcquire double");
843 double x = (double) vh.get();
844 assertEquals(1.0d, x, "failing weakCompareAndSetAcquire double value");
845 }
846
847 {
848 boolean success = false;
849 for (int c = 0; c < WEAK_ATTEMPTS && !success; c++) {
850 success = vh.weakCompareAndSetRelease(1.0d, 2.0d);
851 if (!success) weakDelay();
852 }
853 assertEquals(success, true, "success weakCompareAndSetRelease double");
854 double x = (double) vh.get();
855 assertEquals(2.0d, x, "success weakCompareAndSetRelease double");
856 }
857
858 {
859 boolean success = vh.weakCompareAndSetRelease(1.0d, 3.0d);
860 assertEquals(success, false, "failing weakCompareAndSetRelease double");
861 double x = (double) vh.get();
862 assertEquals(2.0d, x, "failing weakCompareAndSetRelease double value");
863 }
864
865 {
866 boolean success = false;
867 for (int c = 0; c < WEAK_ATTEMPTS && !success; c++) {
868 success = vh.weakCompareAndSet(2.0d, 1.0d);
869 if (!success) weakDelay();
870 }
871 assertEquals(success, true, "success weakCompareAndSet double");
872 double x = (double) vh.get();
873 assertEquals(1.0d, x, "success weakCompareAndSet double");
874 }
875
876 {
877 boolean success = vh.weakCompareAndSet(2.0d, 3.0d);
878 assertEquals(success, false, "failing weakCompareAndSet double");
879 double x = (double) vh.get();
880 assertEquals(1.0d, x, "failing weakCompareAndSet double value");
881 }
882
883 // Compare set and get
884 {
885 vh.set(1.0d);
886
887 double o = (double) vh.getAndSet(2.0d);
888 assertEquals(1.0d, o, "getAndSet double");
889 double x = (double) vh.get();
890 assertEquals(2.0d, x, "getAndSet double value");
891 }
892
893 {
894 vh.set(1.0d);
895
896 double o = (double) vh.getAndSetAcquire(2.0d);
897 assertEquals(1.0d, o, "getAndSetAcquire double");
898 double x = (double) vh.get();
899 assertEquals(2.0d, x, "getAndSetAcquire double value");
900 }
901
902 {
903 vh.set(1.0d);
904
905 double o = (double) vh.getAndSetRelease(2.0d);
906 assertEquals(1.0d, o, "getAndSetRelease double");
907 double x = (double) vh.get();
908 assertEquals(2.0d, x, "getAndSetRelease double value");
909 }
910
911 // get and add, add and get
912 {
913 vh.set(1.0d);
914
915 double o = (double) vh.getAndAdd(2.0d);
916 assertEquals(1.0d, o, "getAndAdd double");
917 double x = (double) vh.get();
918 assertEquals((double)(1.0d + 2.0d), x, "getAndAdd double value");
919 }
920
921 {
922 vh.set(1.0d);
923
924 double o = (double) vh.getAndAddAcquire(2.0d);
925 assertEquals(1.0d, o, "getAndAddAcquire double");
926 double x = (double) vh.get();
927 assertEquals((double)(1.0d + 2.0d), x, "getAndAddAcquire double value");
928 }
929
930 {
931 vh.set(1.0d);
932
933 double o = (double) vh.getAndAddRelease(2.0d);
934 assertEquals(1.0d, o, "getAndAddReleasedouble");
935 double x = (double) vh.get();
936 assertEquals((double)(1.0d + 2.0d), x, "getAndAddRelease double value");
937 }
938
939 }
940
941 static void testStaticFieldUnsupported(VarHandle vh) {
942
943
944 checkUOE(() -> {
945 double o = (double) vh.getAndBitwiseOr(1.0d);
946 });
947
948 checkUOE(() -> {
949 double o = (double) vh.getAndBitwiseOrAcquire(1.0d);
950 });
951
952 checkUOE(() -> {
953 double o = (double) vh.getAndBitwiseOrRelease(1.0d);
954 });
955
956 checkUOE(() -> {
957 double o = (double) vh.getAndBitwiseAnd(1.0d);
958 });
959
960 checkUOE(() -> {
961 double o = (double) vh.getAndBitwiseAndAcquire(1.0d);
962 });
963
964 checkUOE(() -> {
965 double o = (double) vh.getAndBitwiseAndRelease(1.0d);
966 });
967
968 checkUOE(() -> {
969 double o = (double) vh.getAndBitwiseXor(1.0d);
970 });
971
972 checkUOE(() -> {
973 double o = (double) vh.getAndBitwiseXorAcquire(1.0d);
974 });
975
976 checkUOE(() -> {
977 double o = (double) vh.getAndBitwiseXorRelease(1.0d);
978 });
979 }
980
981
982 static void testArray(VarHandle vh) {
983 double[] array = new double[10];
984
985 for (int i = 0; i < array.length; i++) {
986 // Plain
987 {
988 vh.set(array, i, 1.0d);
989 double x = (double) vh.get(array, i);
990 assertEquals(1.0d, x, "get double value");
991 }
992
993
994 // Volatile
995 {
996 vh.setVolatile(array, i, 2.0d);
997 double x = (double) vh.getVolatile(array, i);
998 assertEquals(2.0d, x, "setVolatile double value");
999 }
1000
1001 // Lazy
1002 {
1003 vh.setRelease(array, i, 1.0d);
1004 double x = (double) vh.getAcquire(array, i);
1005 assertEquals(1.0d, x, "setRelease double value");
1006 }
1007
1008 // Opaque
1009 {
1010 vh.setOpaque(array, i, 2.0d);
1011 double x = (double) vh.getOpaque(array, i);
1012 assertEquals(2.0d, x, "setOpaque double value");
1013 }
1014
1015 vh.set(array, i, 1.0d);
1016
1017 // Compare
1018 {
1019 boolean r = vh.compareAndSet(array, i, 1.0d, 2.0d);
1020 assertEquals(r, true, "success compareAndSet double");
1021 double x = (double) vh.get(array, i);
1022 assertEquals(2.0d, x, "success compareAndSet double value");
1023 }
1024
1025 {
1026 boolean r = vh.compareAndSet(array, i, 1.0d, 3.0d);
1027 assertEquals(r, false, "failing compareAndSet double");
1028 double x = (double) vh.get(array, i);
1029 assertEquals(2.0d, x, "failing compareAndSet double value");
1030 }
1031
1032 {
1033 double r = (double) vh.compareAndExchange(array, i, 2.0d, 1.0d);
1034 assertEquals(r, 2.0d, "success compareAndExchange double");
1035 double x = (double) vh.get(array, i);
1036 assertEquals(1.0d, x, "success compareAndExchange double value");
1037 }
1038
1039 {
1040 double r = (double) vh.compareAndExchange(array, i, 2.0d, 3.0d);
1041 assertEquals(r, 1.0d, "failing compareAndExchange double");
1042 double x = (double) vh.get(array, i);
1043 assertEquals(1.0d, x, "failing compareAndExchange double value");
1044 }
1045
1046 {
1047 double r = (double) vh.compareAndExchangeAcquire(array, i, 1.0d, 2.0d);
1048 assertEquals(r, 1.0d, "success compareAndExchangeAcquire double");
1049 double x = (double) vh.get(array, i);
1050 assertEquals(2.0d, x, "success compareAndExchangeAcquire double value");
1051 }
1052
1053 {
1054 double r = (double) vh.compareAndExchangeAcquire(array, i, 1.0d, 3.0d);
1055 assertEquals(r, 2.0d, "failing compareAndExchangeAcquire double");
1056 double x = (double) vh.get(array, i);
1057 assertEquals(2.0d, x, "failing compareAndExchangeAcquire double value");
1058 }
1059
1060 {
1061 double r = (double) vh.compareAndExchangeRelease(array, i, 2.0d, 1.0d);
1062 assertEquals(r, 2.0d, "success compareAndExchangeRelease double");
1063 double x = (double) vh.get(array, i);
1064 assertEquals(1.0d, x, "success compareAndExchangeRelease double value");
1065 }
1066
1067 {
1068 double r = (double) vh.compareAndExchangeRelease(array, i, 2.0d, 3.0d);
1069 assertEquals(r, 1.0d, "failing compareAndExchangeRelease double");
1070 double x = (double) vh.get(array, i);
1071 assertEquals(1.0d, x, "failing compareAndExchangeRelease double value");
1072 }
1073
1074 {
1075 boolean success = false;
1076 for (int c = 0; c < WEAK_ATTEMPTS && !success; c++) {
1077 success = vh.weakCompareAndSetPlain(array, i, 1.0d, 2.0d);
1078 if (!success) weakDelay();
1079 }
1080 assertEquals(success, true, "success weakCompareAndSetPlain double");
1081 double x = (double) vh.get(array, i);
1082 assertEquals(2.0d, x, "success weakCompareAndSetPlain double value");
1083 }
1084
1085 {
1086 boolean success = vh.weakCompareAndSetPlain(array, i, 1.0d, 3.0d);
1087 assertEquals(success, false, "failing weakCompareAndSetPlain double");
1088 double x = (double) vh.get(array, i);
1089 assertEquals(2.0d, x, "failing weakCompareAndSetPlain double value");
1090 }
1091
1092 {
1093 boolean success = false;
1094 for (int c = 0; c < WEAK_ATTEMPTS && !success; c++) {
1095 success = vh.weakCompareAndSetAcquire(array, i, 2.0d, 1.0d);
1096 if (!success) weakDelay();
1097 }
1098 assertEquals(success, true, "success weakCompareAndSetAcquire double");
1099 double x = (double) vh.get(array, i);
1100 assertEquals(1.0d, x, "success weakCompareAndSetAcquire double");
1101 }
1102
1103 {
1104 boolean success = vh.weakCompareAndSetAcquire(array, i, 2.0d, 3.0d);
1105 assertEquals(success, false, "failing weakCompareAndSetAcquire double");
1106 double x = (double) vh.get(array, i);
1107 assertEquals(1.0d, x, "failing weakCompareAndSetAcquire double value");
1108 }
1109
1110 {
1111 boolean success = false;
1112 for (int c = 0; c < WEAK_ATTEMPTS && !success; c++) {
1113 success = vh.weakCompareAndSetRelease(array, i, 1.0d, 2.0d);
1114 if (!success) weakDelay();
1115 }
1116 assertEquals(success, true, "success weakCompareAndSetRelease double");
1117 double x = (double) vh.get(array, i);
1118 assertEquals(2.0d, x, "success weakCompareAndSetRelease double");
1119 }
1120
1121 {
1122 boolean success = vh.weakCompareAndSetRelease(array, i, 1.0d, 3.0d);
1123 assertEquals(success, false, "failing weakCompareAndSetRelease double");
1124 double x = (double) vh.get(array, i);
1125 assertEquals(2.0d, x, "failing weakCompareAndSetRelease double value");
1126 }
1127
1128 {
1129 boolean success = false;
1130 for (int c = 0; c < WEAK_ATTEMPTS && !success; c++) {
1131 success = vh.weakCompareAndSet(array, i, 2.0d, 1.0d);
1132 if (!success) weakDelay();
1133 }
1134 assertEquals(success, true, "success weakCompareAndSet double");
1135 double x = (double) vh.get(array, i);
1136 assertEquals(1.0d, x, "success weakCompareAndSet double");
1137 }
1138
1139 {
1140 boolean success = vh.weakCompareAndSet(array, i, 2.0d, 3.0d);
1141 assertEquals(success, false, "failing weakCompareAndSet double");
1142 double x = (double) vh.get(array, i);
1143 assertEquals(1.0d, x, "failing weakCompareAndSet double value");
1144 }
1145
1146 // Compare set and get
1147 {
1148 vh.set(array, i, 1.0d);
1149
1150 double o = (double) vh.getAndSet(array, i, 2.0d);
1151 assertEquals(1.0d, o, "getAndSet double");
1152 double x = (double) vh.get(array, i);
1153 assertEquals(2.0d, x, "getAndSet double value");
1154 }
1155
1156 {
1157 vh.set(array, i, 1.0d);
1158
1159 double o = (double) vh.getAndSetAcquire(array, i, 2.0d);
1160 assertEquals(1.0d, o, "getAndSetAcquire double");
1161 double x = (double) vh.get(array, i);
1162 assertEquals(2.0d, x, "getAndSetAcquire double value");
1163 }
1164
1165 {
1166 vh.set(array, i, 1.0d);
1167
1168 double o = (double) vh.getAndSetRelease(array, i, 2.0d);
1169 assertEquals(1.0d, o, "getAndSetRelease double");
1170 double x = (double) vh.get(array, i);
1171 assertEquals(2.0d, x, "getAndSetRelease double value");
1172 }
1173
1174 // get and add, add and get
1175 {
1176 vh.set(array, i, 1.0d);
1177
1178 double o = (double) vh.getAndAdd(array, i, 2.0d);
1179 assertEquals(1.0d, o, "getAndAdd double");
1180 double x = (double) vh.get(array, i);
1181 assertEquals((double)(1.0d + 2.0d), x, "getAndAdd double value");
1182 }
1183
1184 {
1185 vh.set(array, i, 1.0d);
1186
1187 double o = (double) vh.getAndAddAcquire(array, i, 2.0d);
1188 assertEquals(1.0d, o, "getAndAddAcquire double");
1189 double x = (double) vh.get(array, i);
1190 assertEquals((double)(1.0d + 2.0d), x, "getAndAddAcquire double value");
1191 }
1192
1193 {
1194 vh.set(array, i, 1.0d);
1195
1196 double o = (double) vh.getAndAddRelease(array, i, 2.0d);
1197 assertEquals(1.0d, o, "getAndAddReleasedouble");
1198 double x = (double) vh.get(array, i);
1199 assertEquals((double)(1.0d + 2.0d), x, "getAndAddRelease double value");
1200 }
1201
1202 }
1203 }
1204
1205 static void testArrayUnsupported(VarHandle vh) {
1206 double[] array = new double[10];
1207
1208 int i = 0;
1209
1210
1211 checkUOE(() -> {
1212 double o = (double) vh.getAndBitwiseOr(array, i, 1.0d);
1213 });
1214
1215 checkUOE(() -> {
1216 double o = (double) vh.getAndBitwiseOrAcquire(array, i, 1.0d);
1217 });
1218
1219 checkUOE(() -> {
1220 double o = (double) vh.getAndBitwiseOrRelease(array, i, 1.0d);
1221 });
1222
1223 checkUOE(() -> {
1224 double o = (double) vh.getAndBitwiseAnd(array, i, 1.0d);
1225 });
1226
1227 checkUOE(() -> {
1228 double o = (double) vh.getAndBitwiseAndAcquire(array, i, 1.0d);
1229 });
1230
1231 checkUOE(() -> {
1232 double o = (double) vh.getAndBitwiseAndRelease(array, i, 1.0d);
1233 });
1234
1235 checkUOE(() -> {
1236 double o = (double) vh.getAndBitwiseXor(array, i, 1.0d);
1237 });
1238
1239 checkUOE(() -> {
1240 double o = (double) vh.getAndBitwiseXorAcquire(array, i, 1.0d);
1241 });
1242
1243 checkUOE(() -> {
1244 double o = (double) vh.getAndBitwiseXorRelease(array, i, 1.0d);
1245 });
1246 }
1247
1248 static void testArrayIndexOutOfBounds(VarHandle vh) throws Throwable {
1249 double[] array = new double[10];
1250
1251 for (int i : new int[]{-1, Integer.MIN_VALUE, 10, 11, Integer.MAX_VALUE}) {
1252 final int ci = i;
1253
1254 checkAIOOBE(() -> {
1255 double x = (double) vh.get(array, ci);
1256 });
1257
1258 checkAIOOBE(() -> {
1259 vh.set(array, ci, 1.0d);
1260 });
1261
1262 checkAIOOBE(() -> {
1263 double x = (double) vh.getVolatile(array, ci);
1264 });
1265
1266 checkAIOOBE(() -> {
1267 vh.setVolatile(array, ci, 1.0d);
1268 });
1269
1270 checkAIOOBE(() -> {
1271 double x = (double) vh.getAcquire(array, ci);
1272 });
1273
1274 checkAIOOBE(() -> {
1275 vh.setRelease(array, ci, 1.0d);
1276 });
1277
1278 checkAIOOBE(() -> {
1279 double x = (double) vh.getOpaque(array, ci);
1280 });
1281
1282 checkAIOOBE(() -> {
1283 vh.setOpaque(array, ci, 1.0d);
1284 });
1285
1286 checkAIOOBE(() -> {
1287 boolean r = vh.compareAndSet(array, ci, 1.0d, 2.0d);
1288 });
1289
1290 checkAIOOBE(() -> {
1291 double r = (double) vh.compareAndExchange(array, ci, 2.0d, 1.0d);
1292 });
1293
1294 checkAIOOBE(() -> {
1295 double r = (double) vh.compareAndExchangeAcquire(array, ci, 2.0d, 1.0d);
1296 });
1297
1298 checkAIOOBE(() -> {
1299 double r = (double) vh.compareAndExchangeRelease(array, ci, 2.0d, 1.0d);
1300 });
1301
1302 checkAIOOBE(() -> {
1303 boolean r = vh.weakCompareAndSetPlain(array, ci, 1.0d, 2.0d);
1304 });
1305
1306 checkAIOOBE(() -> {
1307 boolean r = vh.weakCompareAndSet(array, ci, 1.0d, 2.0d);
1308 });
1309
1310 checkAIOOBE(() -> {
1311 boolean r = vh.weakCompareAndSetAcquire(array, ci, 1.0d, 2.0d);
1312 });
1313
1314 checkAIOOBE(() -> {
1315 boolean r = vh.weakCompareAndSetRelease(array, ci, 1.0d, 2.0d);
1316 });
1317
1318 checkAIOOBE(() -> {
1319 double o = (double) vh.getAndSet(array, ci, 1.0d);
1320 });
1321
1322 checkAIOOBE(() -> {
1323 double o = (double) vh.getAndSetAcquire(array, ci, 1.0d);
1324 });
1325
1326 checkAIOOBE(() -> {
1327 double o = (double) vh.getAndSetRelease(array, ci, 1.0d);
1328 });
1329
1330 checkAIOOBE(() -> {
1331 double o = (double) vh.getAndAdd(array, ci, 1.0d);
1332 });
1333
1334 checkAIOOBE(() -> {
1335 double o = (double) vh.getAndAddAcquire(array, ci, 1.0d);
1336 });
1337
1338 checkAIOOBE(() -> {
1339 double o = (double) vh.getAndAddRelease(array, ci, 1.0d);
1340 });
1341
1342 }
1343 }
1344
1345 }
1346