1 /* 2 * Copyright (c) 2013, 2018, 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 package jit.escape.LockCoarsening; 24 25 import nsk.share.TestFailure; 26 27 class LockCoarsening { 28 // JVM option '-XX:+EliminateLocks' specified 29 public static boolean eliminateLocks = false; 30 // Number of chances Thread 2 has to acquire the lock 31 public static int numChances = 16; 32 33 // Signals to Threads_2 that Thread_1 started execuition 34 public static volatile boolean start; 35 // Signals to Thread_2 to stop execution 36 public static volatile boolean done; 37 // Thread_2 has acquired the lock 38 public static volatile boolean acquiredLock; 39 // Actually running the test 40 public static volatile boolean realrun; 41 // Thread 2 'acquire lock chance' number 42 public static volatile int currentChance; 43 44 static Thread_2 t2; 45 46 public static void main(String[] args) { 47 parseArgs(args); 48 49 Thread.currentThread().getThreadGroup().setMaxPriority(Thread.MAX_PRIORITY); 50 51 currentChance = 1; 52 53 do { 54 System.out.println("Chance " + currentChance + ":"); 55 56 Thread_1 t1 = new Thread_1(); 57 t1.getThreadGroup().setMaxPriority(Thread.MAX_PRIORITY); 58 t1.setPriority(Thread.MIN_PRIORITY); 59 t1.start(); 60 61 try { 62 t1.join(); 63 } catch (InterruptedException e) { 64 } 65 66 System.out.println(); 67 68 // if thread 2 hasn't acquired lock and we are not eliminating them, give it one more try... 69 } while (!eliminateLocks && !acquiredLock && ++currentChance <= numChances); 70 71 System.out.println("Thread 2 has acquired lock: " + acquiredLock); 72 73 boolean failed = false; 74 75 if (!eliminateLocks) { 76 if (!acquiredLock) { 77 failed = true; 78 79 throw new TestFailure("acquiredLock == false, though, '-XX:-EliminateLocks' specified"); 80 } 81 } else { 82 if (acquiredLock) { 83 failed = true; 84 85 throw new TestFailure("acquiredLock == true, though, '-XX:+EliminateLocks' specified"); 86 } 87 } 88 89 if (!failed) 90 System.out.println("TEST PASSED"); 91 else 92 throw new TestFailure("TEST FAILED"); 93 } 94 95 private static void parseArgs(String[] args) { 96 eliminateLocks = false; 97 98 for (int i = 0; i < args.length; ++i) { 99 String arg = args[i]; 100 String val; 101 102 if (arg.equals("-eliminateLocks")) { 103 eliminateLocks = true; 104 } else if (arg.equals("-numChances")) { 105 if (++i >= args.length) 106 throw new TestFailure("'numChances' parameter requires an integer value"); 107 val = args[i]; 108 try { 109 numChances = Integer.parseInt(val); 110 } catch (NumberFormatException e) { 111 throw new TestFailure("invalid value for 'numChances'"); 112 } 113 } else { 114 System.out.println("Invalid argument: " + args); 115 116 } 117 } 118 } 119 120 /** 121 * Thread that enters synchronized parts which are subject of 122 * lock coarsening 123 */ 124 public static class Thread_1 extends Thread { 125 public void run() { 126 Dummy lock = new Dummy(); 127 128 // An ugly-terrible hack to force JIT to compile Thread_1.doit(): 129 // 1: call method from a static method of another class within a loop 130 System.out.println("**** Compilation warm-up *****"); 131 realrun = false; 132 Helper.callMethod(this, lock); 133 134 // 2: call method normally 135 System.out.println("**** Starting real run ****"); 136 realrun = true; 137 this.doit(lock); 138 } 139 140 public final void doit(Dummy _lock) { 141 Dummy lock = new Dummy(); 142 143 start = false; 144 done = false; 145 acquiredLock = false; 146 147 /*Thread_2*/ 148 t2 = new Thread_2(lock); 149 t2.getThreadGroup().setMaxPriority(Thread.MAX_PRIORITY); 150 t2.setPriority(Thread.MAX_PRIORITY); 151 t2.start(); 152 153 //waiting for the Thread_2 to invoke lock.wait() 154 while (t2.getState() != Thread.State.WAITING) { } 155 start = true; 156 157 // The following code is subject to lock coarsening if eliminateLocks == true 158 { 159 synchronized (lock) { 160 lock.foo(); 161 } 162 163 synchronized (lock) { 164 lock.foo(); 165 } 166 167 synchronized (lock) { 168 lock.foo(); 169 } 170 171 synchronized (lock) { 172 lock.foo(); 173 } 174 175 synchronized (lock) { 176 lock.foo(); 177 } 178 179 synchronized (lock) { 180 lock.foo(); 181 } 182 183 synchronized (lock) { 184 lock.foo(); 185 } 186 187 synchronized (lock) { 188 lock.foo(); 189 } 190 191 synchronized (lock) { 192 lock.foo(); 193 } 194 195 synchronized (lock) { 196 lock.foo(); 197 } 198 199 synchronized (lock) { 200 lock.foo(); 201 } 202 203 synchronized (lock) { 204 lock.foo(); 205 } 206 207 synchronized (lock) { 208 lock.foo(); 209 } 210 211 synchronized (lock) { 212 lock.foo(); 213 } 214 215 synchronized (lock) { 216 lock.foo(); 217 } 218 219 synchronized (lock) { 220 lock.foo(); 221 } 222 223 synchronized (lock) { 224 lock.foo(); 225 } 226 227 synchronized (lock) { 228 lock.foo(); 229 } 230 231 synchronized (lock) { 232 lock.foo(); 233 } 234 235 synchronized (lock) { 236 lock.foo(); 237 } 238 239 synchronized (lock) { 240 lock.foo(); 241 } 242 243 synchronized (lock) { 244 lock.foo(); 245 } 246 247 synchronized (lock) { 248 lock.foo(); 249 } 250 251 synchronized (lock) { 252 lock.foo(); 253 } 254 255 synchronized (lock) { 256 lock.foo(); 257 } 258 259 synchronized (lock) { 260 lock.foo(); 261 } 262 263 synchronized (lock) { 264 lock.foo(); 265 } 266 267 synchronized (lock) { 268 lock.foo(); 269 } 270 271 synchronized (lock) { 272 lock.foo(); 273 } 274 275 synchronized (lock) { 276 lock.foo(); 277 } 278 279 synchronized (lock) { 280 lock.foo(); 281 } 282 283 synchronized (lock) { 284 lock.foo(); 285 } 286 287 synchronized (lock) { 288 lock.foo(); 289 } 290 291 synchronized (lock) { 292 lock.foo(); 293 } 294 295 synchronized (lock) { 296 lock.foo(); 297 } 298 299 synchronized (lock) { 300 lock.foo(); 301 } 302 303 synchronized (lock) { 304 lock.foo(); 305 } 306 307 synchronized (lock) { 308 lock.foo(); 309 } 310 311 synchronized (lock) { 312 lock.foo(); 313 } 314 315 synchronized (lock) { 316 lock.foo(); 317 } 318 319 synchronized (lock) { 320 lock.foo(); 321 } 322 323 synchronized (lock) { 324 lock.foo(); 325 } 326 327 synchronized (lock) { 328 lock.foo(); 329 } 330 331 synchronized (lock) { 332 lock.foo(); 333 } 334 335 synchronized (lock) { 336 lock.foo(); 337 } 338 339 synchronized (lock) { 340 lock.foo(); 341 } 342 343 synchronized (lock) { 344 lock.foo(); 345 } 346 347 synchronized (lock) { 348 lock.foo(); 349 } 350 351 synchronized (lock) { 352 lock.foo(); 353 } 354 355 synchronized (lock) { 356 lock.foo(); 357 } 358 359 synchronized (lock) { 360 lock.foo(); 361 } 362 363 synchronized (lock) { 364 lock.foo(); 365 } 366 367 synchronized (lock) { 368 lock.foo(); 369 } 370 371 synchronized (lock) { 372 lock.foo(); 373 } 374 375 synchronized (lock) { 376 lock.foo(); 377 } 378 379 synchronized (lock) { 380 lock.foo(); 381 } 382 383 synchronized (lock) { 384 lock.foo(); 385 } 386 387 synchronized (lock) { 388 lock.foo(); 389 } 390 391 synchronized (lock) { 392 lock.foo(); 393 } 394 395 synchronized (lock) { 396 lock.foo(); 397 } 398 399 synchronized (lock) { 400 lock.foo(); 401 } 402 403 synchronized (lock) { 404 lock.foo(); 405 } 406 407 synchronized (lock) { 408 lock.foo(); 409 } 410 411 synchronized (lock) { 412 lock.foo(); 413 } 414 415 synchronized (lock) { 416 lock.foo(); 417 } 418 419 synchronized (lock) { 420 lock.foo(); 421 } 422 423 synchronized (lock) { 424 lock.foo(); 425 } 426 427 synchronized (lock) { 428 lock.foo(); 429 } 430 431 synchronized (lock) { 432 lock.foo(); 433 } 434 435 synchronized (lock) { 436 lock.foo(); 437 } 438 439 synchronized (lock) { 440 lock.foo(); 441 } 442 443 synchronized (lock) { 444 lock.foo(); 445 } 446 447 synchronized (lock) { 448 lock.foo(); 449 } 450 451 synchronized (lock) { 452 lock.foo(); 453 } 454 455 synchronized (lock) { 456 lock.foo(); 457 } 458 459 synchronized (lock) { 460 lock.foo(); 461 } 462 463 synchronized (lock) { 464 lock.foo(); 465 } 466 467 synchronized (lock) { 468 lock.foo(); 469 } 470 471 synchronized (lock) { 472 lock.foo(); 473 } 474 475 synchronized (lock) { 476 lock.foo(); 477 } 478 479 synchronized (lock) { 480 lock.foo(); 481 } 482 483 synchronized (lock) { 484 lock.foo(); 485 } 486 487 synchronized (lock) { 488 lock.foo(); 489 } 490 491 synchronized (lock) { 492 lock.foo(); 493 } 494 495 synchronized (lock) { 496 lock.foo(); 497 } 498 499 synchronized (lock) { 500 lock.foo(); 501 } 502 503 synchronized (lock) { 504 lock.foo(); 505 } 506 507 synchronized (lock) { 508 lock.foo(); 509 } 510 511 synchronized (lock) { 512 lock.foo(); 513 } 514 515 synchronized (lock) { 516 lock.foo(); 517 } 518 519 synchronized (lock) { 520 lock.foo(); 521 } 522 523 synchronized (lock) { 524 lock.foo(); 525 } 526 527 synchronized (lock) { 528 lock.foo(); 529 } 530 531 synchronized (lock) { 532 lock.foo(); 533 } 534 535 synchronized (lock) { 536 lock.foo(); 537 } 538 539 synchronized (lock) { 540 lock.foo(); 541 } 542 543 synchronized (lock) { 544 lock.foo(); 545 } 546 547 synchronized (lock) { 548 lock.foo(); 549 } 550 551 synchronized (lock) { 552 lock.foo(); 553 } 554 555 synchronized (lock) { 556 lock.foo(); 557 } 558 559 synchronized (lock) { 560 lock.foo(); 561 } 562 563 synchronized (lock) { 564 lock.foo(); 565 } 566 567 synchronized (lock) { 568 lock.foo(); 569 } 570 571 synchronized (lock) { 572 lock.foo(); 573 } 574 575 synchronized (lock) { 576 lock.foo(); 577 } 578 579 synchronized (lock) { 580 lock.foo(); 581 } 582 583 synchronized (lock) { 584 lock.foo(); 585 } 586 587 synchronized (lock) { 588 lock.foo(); 589 } 590 591 synchronized (lock) { 592 lock.foo(); 593 } 594 595 synchronized (lock) { 596 lock.foo(); 597 } 598 599 synchronized (lock) { 600 lock.foo(); 601 } 602 603 synchronized (lock) { 604 lock.foo(); 605 } 606 607 synchronized (lock) { 608 lock.foo(); 609 } 610 611 synchronized (lock) { 612 lock.foo(); 613 } 614 615 synchronized (lock) { 616 lock.foo(); 617 } 618 619 synchronized (lock) { 620 lock.foo(); 621 } 622 623 synchronized (lock) { 624 lock.foo(); 625 } 626 627 synchronized (lock) { 628 lock.foo(); 629 } 630 631 synchronized (lock) { 632 lock.foo(); 633 } 634 635 synchronized (lock) { 636 lock.foo(); 637 } 638 639 synchronized (lock) { 640 lock.foo(); 641 } 642 643 synchronized (lock) { 644 lock.foo(); 645 } 646 647 synchronized (lock) { 648 lock.foo(); 649 } 650 651 synchronized (lock) { 652 lock.foo(); 653 } 654 655 synchronized (lock) { 656 lock.foo(); 657 } 658 659 synchronized (lock) { 660 lock.foo(); 661 } 662 663 synchronized (lock) { 664 lock.foo(); 665 } 666 667 synchronized (lock) { 668 lock.foo(); 669 } 670 671 synchronized (lock) { 672 lock.foo(); 673 } 674 675 synchronized (lock) { 676 lock.foo(); 677 } 678 679 synchronized (lock) { 680 lock.foo(); 681 } 682 683 synchronized (lock) { 684 lock.foo(); 685 } 686 687 synchronized (lock) { 688 lock.foo(); 689 } 690 691 synchronized (lock) { 692 lock.foo(); 693 } 694 695 synchronized (lock) { 696 lock.foo(); 697 } 698 699 synchronized (lock) { 700 lock.foo(); 701 } 702 703 synchronized (lock) { 704 lock.foo(); 705 } 706 707 synchronized (lock) { 708 lock.foo(); 709 } 710 711 synchronized (lock) { 712 lock.foo(); 713 } 714 715 synchronized (lock) { 716 lock.foo(); 717 } 718 719 synchronized (lock) { 720 lock.foo(); 721 } 722 723 synchronized (lock) { 724 lock.foo(); 725 } 726 727 synchronized (lock) { 728 lock.foo(); 729 } 730 731 synchronized (lock) { 732 lock.foo(); 733 } 734 735 synchronized (lock) { 736 lock.foo(); 737 } 738 739 synchronized (lock) { 740 lock.foo(); 741 } 742 743 synchronized (lock) { 744 lock.foo(); 745 } 746 747 synchronized (lock) { 748 lock.foo(); 749 } 750 751 synchronized (lock) { 752 lock.foo(); 753 } 754 755 synchronized (lock) { 756 lock.foo(); 757 } 758 759 synchronized (lock) { 760 lock.foo(); 761 } 762 763 synchronized (lock) { 764 lock.foo(); 765 } 766 767 synchronized (lock) { 768 lock.foo(); 769 } 770 771 synchronized (lock) { 772 lock.foo(); 773 } 774 775 synchronized (lock) { 776 lock.foo(); 777 } 778 779 synchronized (lock) { 780 lock.foo(); 781 } 782 783 synchronized (lock) { 784 lock.foo(); 785 } 786 787 synchronized (lock) { 788 lock.foo(); 789 } 790 791 synchronized (lock) { 792 lock.foo(); 793 } 794 795 synchronized (lock) { 796 lock.foo(); 797 } 798 799 synchronized (lock) { 800 lock.foo(); 801 } 802 803 synchronized (lock) { 804 lock.foo(); 805 } 806 807 synchronized (lock) { 808 lock.foo(); 809 } 810 811 synchronized (lock) { 812 lock.foo(); 813 } 814 815 synchronized (lock) { 816 lock.foo(); 817 } 818 819 synchronized (lock) { 820 lock.foo(); 821 } 822 823 synchronized (lock) { 824 lock.foo(); 825 } 826 827 synchronized (lock) { 828 lock.foo(); 829 } 830 831 synchronized (lock) { 832 lock.foo(); 833 } 834 835 synchronized (lock) { 836 lock.foo(); 837 } 838 839 synchronized (lock) { 840 lock.foo(); 841 } 842 843 synchronized (lock) { 844 lock.foo(); 845 } 846 847 synchronized (lock) { 848 lock.foo(); 849 } 850 851 synchronized (lock) { 852 lock.foo(); 853 } 854 855 synchronized (lock) { 856 lock.foo(); 857 } 858 859 synchronized (lock) { 860 lock.foo(); 861 } 862 863 synchronized (lock) { 864 lock.foo(); 865 } 866 867 synchronized (lock) { 868 lock.foo(); 869 } 870 871 synchronized (lock) { 872 lock.foo(); 873 } 874 875 synchronized (lock) { 876 lock.foo(); 877 } 878 879 synchronized (lock) { 880 lock.foo(); 881 } 882 883 synchronized (lock) { 884 lock.foo(); 885 } 886 887 synchronized (lock) { 888 lock.foo(); 889 } 890 891 synchronized (lock) { 892 lock.foo(); 893 } 894 895 synchronized (lock) { 896 lock.foo(); 897 } 898 899 synchronized (lock) { 900 lock.foo(); 901 } 902 903 synchronized (lock) { 904 lock.foo(); 905 } 906 907 synchronized (lock) { 908 lock.foo(); 909 } 910 911 synchronized (lock) { 912 lock.foo(); 913 } 914 915 synchronized (lock) { 916 lock.foo(); 917 } 918 919 synchronized (lock) { 920 lock.foo(); 921 } 922 923 synchronized (lock) { 924 lock.foo(); 925 } 926 927 synchronized (lock) { 928 lock.foo(); 929 } 930 931 synchronized (lock) { 932 lock.foo(); 933 } 934 935 synchronized (lock) { 936 lock.foo(); 937 } 938 939 synchronized (lock) { 940 lock.foo(); 941 } 942 943 synchronized (lock) { 944 lock.foo(); 945 } 946 947 synchronized (lock) { 948 lock.foo(); 949 } 950 951 synchronized (lock) { 952 lock.foo(); 953 } 954 955 synchronized (lock) { 956 lock.foo(); 957 } 958 959 synchronized (lock) { 960 lock.foo(); 961 } 962 963 synchronized (lock) { 964 lock.foo(); 965 } 966 967 synchronized (lock) { 968 lock.foo(); 969 } 970 971 synchronized (lock) { 972 lock.foo(); 973 } 974 975 synchronized (lock) { 976 lock.foo(); 977 } 978 979 synchronized (lock) { 980 lock.foo(); 981 } 982 983 synchronized (lock) { 984 lock.foo(); 985 } 986 987 synchronized (lock) { 988 lock.foo(); 989 } 990 991 synchronized (lock) { 992 lock.foo(); 993 } 994 995 synchronized (lock) { 996 lock.foo(); 997 } 998 999 synchronized (lock) { 1000 lock.foo(); 1001 } 1002 1003 synchronized (lock) { 1004 lock.foo(); 1005 } 1006 1007 synchronized (lock) { 1008 lock.foo(); 1009 } 1010 1011 synchronized (lock) { 1012 lock.foo(); 1013 } 1014 1015 synchronized (lock) { 1016 lock.foo(); 1017 } 1018 1019 synchronized (lock) { 1020 lock.foo(); 1021 } 1022 1023 synchronized (lock) { 1024 lock.foo(); 1025 } 1026 1027 synchronized (lock) { 1028 lock.foo(); 1029 } 1030 1031 synchronized (lock) { 1032 lock.foo(); 1033 } 1034 1035 synchronized (lock) { 1036 lock.foo(); 1037 } 1038 1039 synchronized (lock) { 1040 lock.foo(); 1041 } 1042 1043 synchronized (lock) { 1044 lock.foo(); 1045 } 1046 1047 synchronized (lock) { 1048 lock.foo(); 1049 } 1050 1051 synchronized (lock) { 1052 lock.foo(); 1053 } 1054 1055 synchronized (lock) { 1056 lock.foo(); 1057 } 1058 1059 synchronized (lock) { 1060 lock.foo(); 1061 } 1062 1063 synchronized (lock) { 1064 lock.foo(); 1065 } 1066 1067 synchronized (lock) { 1068 lock.foo(); 1069 } 1070 1071 synchronized (lock) { 1072 lock.foo(); 1073 } 1074 1075 synchronized (lock) { 1076 lock.foo(); 1077 } 1078 1079 synchronized (lock) { 1080 lock.foo(); 1081 } 1082 1083 synchronized (lock) { 1084 lock.foo(); 1085 } 1086 1087 synchronized (lock) { 1088 lock.foo(); 1089 } 1090 1091 synchronized (lock) { 1092 lock.foo(); 1093 } 1094 1095 synchronized (lock) { 1096 lock.foo(); 1097 } 1098 1099 synchronized (lock) { 1100 lock.foo(); 1101 } 1102 1103 synchronized (lock) { 1104 lock.foo(); 1105 } 1106 1107 synchronized (lock) { 1108 lock.foo(); 1109 } 1110 1111 synchronized (lock) { 1112 lock.foo(); 1113 } 1114 1115 synchronized (lock) { 1116 lock.foo(); 1117 } 1118 1119 synchronized (lock) { 1120 lock.foo(); 1121 } 1122 1123 synchronized (lock) { 1124 lock.foo(); 1125 } 1126 1127 synchronized (lock) { 1128 lock.foo(); 1129 } 1130 1131 synchronized (lock) { 1132 lock.foo(); 1133 } 1134 1135 synchronized (lock) { 1136 lock.foo(); 1137 } 1138 1139 synchronized (lock) { 1140 lock.foo(); 1141 } 1142 1143 synchronized (lock) { 1144 lock.foo(); 1145 } 1146 1147 synchronized (lock) { 1148 lock.foo(); 1149 } 1150 1151 synchronized (lock) { 1152 lock.foo(); 1153 } 1154 1155 synchronized (lock) { 1156 lock.foo(); 1157 } 1158 1159 synchronized (lock) { 1160 lock.foo(); 1161 } 1162 1163 synchronized (lock) { 1164 lock.foo(); 1165 } 1166 1167 synchronized (lock) { 1168 lock.foo(); 1169 } 1170 1171 synchronized (lock) { 1172 lock.foo(); 1173 } 1174 1175 synchronized (lock) { 1176 lock.foo(); 1177 } 1178 1179 synchronized (lock) { 1180 lock.foo(); 1181 } 1182 1183 synchronized (lock) { 1184 lock.foo(); 1185 } 1186 1187 synchronized (lock) { 1188 lock.foo(); 1189 } 1190 1191 synchronized (lock) { 1192 lock.foo(); 1193 } 1194 1195 synchronized (lock) { 1196 lock.foo(); 1197 } 1198 1199 synchronized (lock) { 1200 lock.foo(); 1201 } 1202 1203 synchronized (lock) { 1204 lock.foo(); 1205 } 1206 1207 synchronized (lock) { 1208 lock.foo(); 1209 } 1210 1211 synchronized (lock) { 1212 lock.foo(); 1213 } 1214 1215 synchronized (lock) { 1216 lock.foo(); 1217 } 1218 1219 synchronized (lock) { 1220 lock.foo(); 1221 } 1222 1223 synchronized (lock) { 1224 lock.foo(); 1225 } 1226 1227 synchronized (lock) { 1228 lock.foo(); 1229 } 1230 1231 synchronized (lock) { 1232 lock.foo(); 1233 } 1234 1235 synchronized (lock) { 1236 lock.foo(); 1237 } 1238 1239 synchronized (lock) { 1240 lock.foo(); 1241 } 1242 1243 synchronized (lock) { 1244 lock.foo(); 1245 } 1246 1247 synchronized (lock) { 1248 lock.foo(); 1249 } 1250 1251 synchronized (lock) { 1252 lock.foo(); 1253 } 1254 1255 synchronized (lock) { 1256 lock.foo(); 1257 } 1258 1259 synchronized (lock) { 1260 lock.foo(); 1261 } 1262 1263 synchronized (lock) { 1264 lock.foo(); 1265 } 1266 1267 synchronized (lock) { 1268 lock.foo(); 1269 } 1270 1271 synchronized (lock) { 1272 lock.foo(); 1273 } 1274 1275 synchronized (lock) { 1276 lock.foo(); 1277 } 1278 1279 synchronized (lock) { 1280 lock.foo(); 1281 } 1282 1283 synchronized (lock) { 1284 lock.foo(); 1285 } 1286 1287 synchronized (lock) { 1288 lock.foo(); 1289 } 1290 1291 synchronized (lock) { 1292 lock.foo(); 1293 } 1294 1295 synchronized (lock) { 1296 lock.foo(); 1297 } 1298 1299 synchronized (lock) { 1300 lock.foo(); 1301 } 1302 1303 synchronized (lock) { 1304 lock.foo(); 1305 } 1306 1307 synchronized (lock) { 1308 lock.foo(); 1309 } 1310 1311 synchronized (lock) { 1312 lock.foo(); 1313 } 1314 1315 synchronized (lock) { 1316 lock.foo(); 1317 } 1318 1319 synchronized (lock) { 1320 lock.foo(); 1321 } 1322 1323 synchronized (lock) { 1324 lock.foo(); 1325 } 1326 1327 synchronized (lock) { 1328 lock.foo(); 1329 } 1330 1331 synchronized (lock) { 1332 lock.foo(); 1333 } 1334 1335 synchronized (lock) { 1336 lock.foo(); 1337 } 1338 1339 synchronized (lock) { 1340 lock.foo(); 1341 } 1342 1343 synchronized (lock) { 1344 lock.foo(); 1345 } 1346 1347 synchronized (lock) { 1348 lock.foo(); 1349 } 1350 1351 synchronized (lock) { 1352 lock.foo(); 1353 } 1354 1355 // Footer 1356 synchronized (lock) { 1357 lock.foo(); 1358 1359 done = true; 1360 1361 lock.notify(); 1362 } 1363 } 1364 try { 1365 t2.join(); 1366 } catch (InterruptedException e) { 1367 } 1368 } 1369 } 1370 1371 /** 1372 * Thread that tries to acquire lock during lock coarsening. 1373 * If it unable to do it then lock coarsening occurred. 1374 */ 1375 private static class Thread_2 extends Thread { 1376 private Dummy lock; 1377 1378 public Thread_2(Dummy lock) { 1379 this.lock = lock; 1380 } 1381 1382 public void run() { 1383 Dummy lock = this.lock; 1384 1385 synchronized (lock) { 1386 if (!done) { 1387 while (!start) { 1388 try { 1389 lock.wait(); 1390 } catch (InterruptedException e) { 1391 System.out.println("Interrupted!"); 1392 } 1393 } 1394 1395 if (!done) { 1396 done = true; 1397 1398 acquiredLock = true; 1399 1400 if (realrun) { 1401 System.out.println("Acquired lock at " + lock.counter + " iteration of " + currentChance + " chance"); 1402 } else if (eliminateLocks) { 1403 //forcibly stop warm-up as we see that lock coarsening occurs 1404 Helper.allowExec = true; 1405 } 1406 1407 } 1408 } 1409 } 1410 } 1411 } 1412 1413 /** 1414 * Helper class to make method Thread_1.doit() be compiled. 1415 */ 1416 public static class Helper { 1417 public static volatile boolean allowExec = false; 1418 private static int iterations = 10000; 1419 1420 public static void callMethod(Thread_1 t, Dummy lock) { 1421 for (int i = 0; i < iterations; ++i) { 1422 t.doit(lock); 1423 if (allowExec) 1424 break; 1425 } 1426 } 1427 } 1428 1429 /** 1430 * Class to count number of synchronized statement. 1431 * If test fails Dummy.counter shows iteration when lock coarsening did not happen 1432 */ 1433 public static class Dummy { 1434 public volatile int counter = 0; 1435 1436 public void foo() { 1437 if (done) 1438 return; 1439 1440 while (t2.getState() != Thread.State.BLOCKED && t2.getState() != Thread.State.WAITING) { 1441 this.notifyAll(); 1442 1443 Thread.yield(); 1444 } 1445 1446 this.notifyAll(); 1447 1448 while (t2.getState() != Thread.State.BLOCKED) { 1449 Thread.yield(); 1450 } 1451 1452 ++counter; 1453 1454 Thread.yield(); 1455 Thread.yield(); 1456 Thread.yield(); 1457 Thread.yield(); 1458 Thread.yield(); 1459 Thread.yield(); 1460 Thread.yield(); 1461 Thread.yield(); 1462 Thread.yield(); 1463 Thread.yield(); 1464 Thread.yield(); 1465 Thread.yield(); 1466 Thread.yield(); 1467 Thread.yield(); 1468 Thread.yield(); 1469 Thread.yield(); 1470 Thread.yield(); 1471 Thread.yield(); 1472 Thread.yield(); 1473 Thread.yield(); 1474 } 1475 } 1476 }