Path: blob/master/test/hotspot/jtreg/vmTestbase/jit/escape/LockCoarsening/LockCoarsening.java
41155 views
/*1* Copyright (c) 2013, 2020, Oracle and/or its affiliates. All rights reserved.2* DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.3*4* This code is free software; you can redistribute it and/or modify it5* under the terms of the GNU General Public License version 2 only, as6* published by the Free Software Foundation.7*8* This code is distributed in the hope that it will be useful, but WITHOUT9* ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or10* FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License11* version 2 for more details (a copy is included in the LICENSE file that12* accompanied this code).13*14* You should have received a copy of the GNU General Public License version15* 2 along with this work; if not, write to the Free Software Foundation,16* Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA.17*18* Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA19* or visit www.oracle.com if you need additional information or have any20* questions.21*/22package jit.escape.LockCoarsening;2324import nsk.share.TestFailure;2526public class LockCoarsening {27// JVM option '-XX:+EliminateLocks' specified28public static boolean eliminateLocks = false;29// Number of chances Thread 2 has to acquire the lock30public static int numChances = 16;3132// Signals to Threads_2 that Thread_1 started execuition33public static volatile boolean start;34// Signals to Thread_2 to stop execution35public static volatile boolean done;36// Thread_2 has acquired the lock37public static volatile boolean acquiredLock;38// Actually running the test39public static volatile boolean realrun;40// Thread 2 'acquire lock chance' number41public static volatile int currentChance;4243static Thread_2 t2;4445public static void main(String[] args) {46parseArgs(args);4748Thread.currentThread().getThreadGroup().setMaxPriority(Thread.MAX_PRIORITY);4950currentChance = 1;5152do {53System.out.println("Chance " + currentChance + ":");5455Thread_1 t1 = new Thread_1();56t1.getThreadGroup().setMaxPriority(Thread.MAX_PRIORITY);57t1.setPriority(Thread.MIN_PRIORITY);58t1.start();5960try {61t1.join();62} catch (InterruptedException e) {63}6465System.out.println();6667// if thread 2 hasn't acquired lock and we are not eliminating them, give it one more try...68} while (!eliminateLocks && !acquiredLock && ++currentChance <= numChances);6970System.out.println("Thread 2 has acquired lock: " + acquiredLock);7172boolean failed = false;7374if (!eliminateLocks) {75if (!acquiredLock) {76failed = true;7778throw new TestFailure("acquiredLock == false, though, '-XX:-EliminateLocks' specified");79}80} else {81if (acquiredLock) {82failed = true;8384throw new TestFailure("acquiredLock == true, though, '-XX:+EliminateLocks' specified");85}86}8788if (!failed)89System.out.println("TEST PASSED");90else91throw new TestFailure("TEST FAILED");92}9394private static void parseArgs(String[] args) {95eliminateLocks = false;9697for (int i = 0; i < args.length; ++i) {98String arg = args[i];99String val;100101if (arg.equals("-eliminateLocks")) {102eliminateLocks = true;103} else if (arg.equals("-numChances")) {104if (++i >= args.length)105throw new TestFailure("'numChances' parameter requires an integer value");106val = args[i];107try {108numChances = Integer.parseInt(val);109} catch (NumberFormatException e) {110throw new TestFailure("invalid value for 'numChances'");111}112} else {113System.out.println("Invalid argument: " + args);114115}116}117}118119/**120* Thread that enters synchronized parts which are subject of121* lock coarsening122*/123public static class Thread_1 extends Thread {124public void run() {125Dummy lock = new Dummy();126127// An ugly-terrible hack to force JIT to compile Thread_1.doit():128// 1: call method from a static method of another class within a loop129System.out.println("**** Compilation warm-up *****");130realrun = false;131Helper.callMethod(this, lock);132133// 2: call method normally134System.out.println("**** Starting real run ****");135realrun = true;136this.doit(lock);137}138139public final void doit(Dummy _lock) {140Dummy lock = new Dummy();141142start = false;143done = false;144acquiredLock = false;145146/*Thread_2*/147t2 = new Thread_2(lock);148t2.getThreadGroup().setMaxPriority(Thread.MAX_PRIORITY);149t2.setPriority(Thread.MAX_PRIORITY);150t2.start();151152//waiting for the Thread_2 to invoke lock.wait()153while (t2.getState() != Thread.State.WAITING) { }154start = true;155156// The following code is subject to lock coarsening if eliminateLocks == true157{158synchronized (lock) {159lock.foo();160}161162synchronized (lock) {163lock.foo();164}165166synchronized (lock) {167lock.foo();168}169170synchronized (lock) {171lock.foo();172}173174synchronized (lock) {175lock.foo();176}177178synchronized (lock) {179lock.foo();180}181182synchronized (lock) {183lock.foo();184}185186synchronized (lock) {187lock.foo();188}189190synchronized (lock) {191lock.foo();192}193194synchronized (lock) {195lock.foo();196}197198synchronized (lock) {199lock.foo();200}201202synchronized (lock) {203lock.foo();204}205206synchronized (lock) {207lock.foo();208}209210synchronized (lock) {211lock.foo();212}213214synchronized (lock) {215lock.foo();216}217218synchronized (lock) {219lock.foo();220}221222synchronized (lock) {223lock.foo();224}225226synchronized (lock) {227lock.foo();228}229230synchronized (lock) {231lock.foo();232}233234synchronized (lock) {235lock.foo();236}237238synchronized (lock) {239lock.foo();240}241242synchronized (lock) {243lock.foo();244}245246synchronized (lock) {247lock.foo();248}249250synchronized (lock) {251lock.foo();252}253254synchronized (lock) {255lock.foo();256}257258synchronized (lock) {259lock.foo();260}261262synchronized (lock) {263lock.foo();264}265266synchronized (lock) {267lock.foo();268}269270synchronized (lock) {271lock.foo();272}273274synchronized (lock) {275lock.foo();276}277278synchronized (lock) {279lock.foo();280}281282synchronized (lock) {283lock.foo();284}285286synchronized (lock) {287lock.foo();288}289290synchronized (lock) {291lock.foo();292}293294synchronized (lock) {295lock.foo();296}297298synchronized (lock) {299lock.foo();300}301302synchronized (lock) {303lock.foo();304}305306synchronized (lock) {307lock.foo();308}309310synchronized (lock) {311lock.foo();312}313314synchronized (lock) {315lock.foo();316}317318synchronized (lock) {319lock.foo();320}321322synchronized (lock) {323lock.foo();324}325326synchronized (lock) {327lock.foo();328}329330synchronized (lock) {331lock.foo();332}333334synchronized (lock) {335lock.foo();336}337338synchronized (lock) {339lock.foo();340}341342synchronized (lock) {343lock.foo();344}345346synchronized (lock) {347lock.foo();348}349350synchronized (lock) {351lock.foo();352}353354synchronized (lock) {355lock.foo();356}357358synchronized (lock) {359lock.foo();360}361362synchronized (lock) {363lock.foo();364}365366synchronized (lock) {367lock.foo();368}369370synchronized (lock) {371lock.foo();372}373374synchronized (lock) {375lock.foo();376}377378synchronized (lock) {379lock.foo();380}381382synchronized (lock) {383lock.foo();384}385386synchronized (lock) {387lock.foo();388}389390synchronized (lock) {391lock.foo();392}393394synchronized (lock) {395lock.foo();396}397398synchronized (lock) {399lock.foo();400}401402synchronized (lock) {403lock.foo();404}405406synchronized (lock) {407lock.foo();408}409410synchronized (lock) {411lock.foo();412}413414synchronized (lock) {415lock.foo();416}417418synchronized (lock) {419lock.foo();420}421422synchronized (lock) {423lock.foo();424}425426synchronized (lock) {427lock.foo();428}429430synchronized (lock) {431lock.foo();432}433434synchronized (lock) {435lock.foo();436}437438synchronized (lock) {439lock.foo();440}441442synchronized (lock) {443lock.foo();444}445446synchronized (lock) {447lock.foo();448}449450synchronized (lock) {451lock.foo();452}453454synchronized (lock) {455lock.foo();456}457458synchronized (lock) {459lock.foo();460}461462synchronized (lock) {463lock.foo();464}465466synchronized (lock) {467lock.foo();468}469470synchronized (lock) {471lock.foo();472}473474synchronized (lock) {475lock.foo();476}477478synchronized (lock) {479lock.foo();480}481482synchronized (lock) {483lock.foo();484}485486synchronized (lock) {487lock.foo();488}489490synchronized (lock) {491lock.foo();492}493494synchronized (lock) {495lock.foo();496}497498synchronized (lock) {499lock.foo();500}501502synchronized (lock) {503lock.foo();504}505506synchronized (lock) {507lock.foo();508}509510synchronized (lock) {511lock.foo();512}513514synchronized (lock) {515lock.foo();516}517518synchronized (lock) {519lock.foo();520}521522synchronized (lock) {523lock.foo();524}525526synchronized (lock) {527lock.foo();528}529530synchronized (lock) {531lock.foo();532}533534synchronized (lock) {535lock.foo();536}537538synchronized (lock) {539lock.foo();540}541542synchronized (lock) {543lock.foo();544}545546synchronized (lock) {547lock.foo();548}549550synchronized (lock) {551lock.foo();552}553554synchronized (lock) {555lock.foo();556}557558synchronized (lock) {559lock.foo();560}561562synchronized (lock) {563lock.foo();564}565566synchronized (lock) {567lock.foo();568}569570synchronized (lock) {571lock.foo();572}573574synchronized (lock) {575lock.foo();576}577578synchronized (lock) {579lock.foo();580}581582synchronized (lock) {583lock.foo();584}585586synchronized (lock) {587lock.foo();588}589590synchronized (lock) {591lock.foo();592}593594synchronized (lock) {595lock.foo();596}597598synchronized (lock) {599lock.foo();600}601602synchronized (lock) {603lock.foo();604}605606synchronized (lock) {607lock.foo();608}609610synchronized (lock) {611lock.foo();612}613614synchronized (lock) {615lock.foo();616}617618synchronized (lock) {619lock.foo();620}621622synchronized (lock) {623lock.foo();624}625626synchronized (lock) {627lock.foo();628}629630synchronized (lock) {631lock.foo();632}633634synchronized (lock) {635lock.foo();636}637638synchronized (lock) {639lock.foo();640}641642synchronized (lock) {643lock.foo();644}645646synchronized (lock) {647lock.foo();648}649650synchronized (lock) {651lock.foo();652}653654synchronized (lock) {655lock.foo();656}657658synchronized (lock) {659lock.foo();660}661662synchronized (lock) {663lock.foo();664}665666synchronized (lock) {667lock.foo();668}669670synchronized (lock) {671lock.foo();672}673674synchronized (lock) {675lock.foo();676}677678synchronized (lock) {679lock.foo();680}681682synchronized (lock) {683lock.foo();684}685686synchronized (lock) {687lock.foo();688}689690synchronized (lock) {691lock.foo();692}693694synchronized (lock) {695lock.foo();696}697698synchronized (lock) {699lock.foo();700}701702synchronized (lock) {703lock.foo();704}705706synchronized (lock) {707lock.foo();708}709710synchronized (lock) {711lock.foo();712}713714synchronized (lock) {715lock.foo();716}717718synchronized (lock) {719lock.foo();720}721722synchronized (lock) {723lock.foo();724}725726synchronized (lock) {727lock.foo();728}729730synchronized (lock) {731lock.foo();732}733734synchronized (lock) {735lock.foo();736}737738synchronized (lock) {739lock.foo();740}741742synchronized (lock) {743lock.foo();744}745746synchronized (lock) {747lock.foo();748}749750synchronized (lock) {751lock.foo();752}753754synchronized (lock) {755lock.foo();756}757758synchronized (lock) {759lock.foo();760}761762synchronized (lock) {763lock.foo();764}765766synchronized (lock) {767lock.foo();768}769770synchronized (lock) {771lock.foo();772}773774synchronized (lock) {775lock.foo();776}777778synchronized (lock) {779lock.foo();780}781782synchronized (lock) {783lock.foo();784}785786synchronized (lock) {787lock.foo();788}789790synchronized (lock) {791lock.foo();792}793794synchronized (lock) {795lock.foo();796}797798synchronized (lock) {799lock.foo();800}801802synchronized (lock) {803lock.foo();804}805806synchronized (lock) {807lock.foo();808}809810synchronized (lock) {811lock.foo();812}813814synchronized (lock) {815lock.foo();816}817818synchronized (lock) {819lock.foo();820}821822synchronized (lock) {823lock.foo();824}825826synchronized (lock) {827lock.foo();828}829830synchronized (lock) {831lock.foo();832}833834synchronized (lock) {835lock.foo();836}837838synchronized (lock) {839lock.foo();840}841842synchronized (lock) {843lock.foo();844}845846synchronized (lock) {847lock.foo();848}849850synchronized (lock) {851lock.foo();852}853854synchronized (lock) {855lock.foo();856}857858synchronized (lock) {859lock.foo();860}861862synchronized (lock) {863lock.foo();864}865866synchronized (lock) {867lock.foo();868}869870synchronized (lock) {871lock.foo();872}873874synchronized (lock) {875lock.foo();876}877878synchronized (lock) {879lock.foo();880}881882synchronized (lock) {883lock.foo();884}885886synchronized (lock) {887lock.foo();888}889890synchronized (lock) {891lock.foo();892}893894synchronized (lock) {895lock.foo();896}897898synchronized (lock) {899lock.foo();900}901902synchronized (lock) {903lock.foo();904}905906synchronized (lock) {907lock.foo();908}909910synchronized (lock) {911lock.foo();912}913914synchronized (lock) {915lock.foo();916}917918synchronized (lock) {919lock.foo();920}921922synchronized (lock) {923lock.foo();924}925926synchronized (lock) {927lock.foo();928}929930synchronized (lock) {931lock.foo();932}933934synchronized (lock) {935lock.foo();936}937938synchronized (lock) {939lock.foo();940}941942synchronized (lock) {943lock.foo();944}945946synchronized (lock) {947lock.foo();948}949950synchronized (lock) {951lock.foo();952}953954synchronized (lock) {955lock.foo();956}957958synchronized (lock) {959lock.foo();960}961962synchronized (lock) {963lock.foo();964}965966synchronized (lock) {967lock.foo();968}969970synchronized (lock) {971lock.foo();972}973974synchronized (lock) {975lock.foo();976}977978synchronized (lock) {979lock.foo();980}981982synchronized (lock) {983lock.foo();984}985986synchronized (lock) {987lock.foo();988}989990synchronized (lock) {991lock.foo();992}993994synchronized (lock) {995lock.foo();996}997998synchronized (lock) {999lock.foo();1000}10011002synchronized (lock) {1003lock.foo();1004}10051006synchronized (lock) {1007lock.foo();1008}10091010synchronized (lock) {1011lock.foo();1012}10131014synchronized (lock) {1015lock.foo();1016}10171018synchronized (lock) {1019lock.foo();1020}10211022synchronized (lock) {1023lock.foo();1024}10251026synchronized (lock) {1027lock.foo();1028}10291030synchronized (lock) {1031lock.foo();1032}10331034synchronized (lock) {1035lock.foo();1036}10371038synchronized (lock) {1039lock.foo();1040}10411042synchronized (lock) {1043lock.foo();1044}10451046synchronized (lock) {1047lock.foo();1048}10491050synchronized (lock) {1051lock.foo();1052}10531054synchronized (lock) {1055lock.foo();1056}10571058synchronized (lock) {1059lock.foo();1060}10611062synchronized (lock) {1063lock.foo();1064}10651066synchronized (lock) {1067lock.foo();1068}10691070synchronized (lock) {1071lock.foo();1072}10731074synchronized (lock) {1075lock.foo();1076}10771078synchronized (lock) {1079lock.foo();1080}10811082synchronized (lock) {1083lock.foo();1084}10851086synchronized (lock) {1087lock.foo();1088}10891090synchronized (lock) {1091lock.foo();1092}10931094synchronized (lock) {1095lock.foo();1096}10971098synchronized (lock) {1099lock.foo();1100}11011102synchronized (lock) {1103lock.foo();1104}11051106synchronized (lock) {1107lock.foo();1108}11091110synchronized (lock) {1111lock.foo();1112}11131114synchronized (lock) {1115lock.foo();1116}11171118synchronized (lock) {1119lock.foo();1120}11211122synchronized (lock) {1123lock.foo();1124}11251126synchronized (lock) {1127lock.foo();1128}11291130synchronized (lock) {1131lock.foo();1132}11331134synchronized (lock) {1135lock.foo();1136}11371138synchronized (lock) {1139lock.foo();1140}11411142synchronized (lock) {1143lock.foo();1144}11451146synchronized (lock) {1147lock.foo();1148}11491150synchronized (lock) {1151lock.foo();1152}11531154synchronized (lock) {1155lock.foo();1156}11571158synchronized (lock) {1159lock.foo();1160}11611162synchronized (lock) {1163lock.foo();1164}11651166synchronized (lock) {1167lock.foo();1168}11691170synchronized (lock) {1171lock.foo();1172}11731174synchronized (lock) {1175lock.foo();1176}11771178synchronized (lock) {1179lock.foo();1180}11811182synchronized (lock) {1183lock.foo();1184}11851186synchronized (lock) {1187lock.foo();1188}11891190synchronized (lock) {1191lock.foo();1192}11931194synchronized (lock) {1195lock.foo();1196}11971198synchronized (lock) {1199lock.foo();1200}12011202synchronized (lock) {1203lock.foo();1204}12051206synchronized (lock) {1207lock.foo();1208}12091210synchronized (lock) {1211lock.foo();1212}12131214synchronized (lock) {1215lock.foo();1216}12171218synchronized (lock) {1219lock.foo();1220}12211222synchronized (lock) {1223lock.foo();1224}12251226synchronized (lock) {1227lock.foo();1228}12291230synchronized (lock) {1231lock.foo();1232}12331234synchronized (lock) {1235lock.foo();1236}12371238synchronized (lock) {1239lock.foo();1240}12411242synchronized (lock) {1243lock.foo();1244}12451246synchronized (lock) {1247lock.foo();1248}12491250synchronized (lock) {1251lock.foo();1252}12531254synchronized (lock) {1255lock.foo();1256}12571258synchronized (lock) {1259lock.foo();1260}12611262synchronized (lock) {1263lock.foo();1264}12651266synchronized (lock) {1267lock.foo();1268}12691270synchronized (lock) {1271lock.foo();1272}12731274synchronized (lock) {1275lock.foo();1276}12771278synchronized (lock) {1279lock.foo();1280}12811282synchronized (lock) {1283lock.foo();1284}12851286synchronized (lock) {1287lock.foo();1288}12891290synchronized (lock) {1291lock.foo();1292}12931294synchronized (lock) {1295lock.foo();1296}12971298synchronized (lock) {1299lock.foo();1300}13011302synchronized (lock) {1303lock.foo();1304}13051306synchronized (lock) {1307lock.foo();1308}13091310synchronized (lock) {1311lock.foo();1312}13131314synchronized (lock) {1315lock.foo();1316}13171318synchronized (lock) {1319lock.foo();1320}13211322synchronized (lock) {1323lock.foo();1324}13251326synchronized (lock) {1327lock.foo();1328}13291330synchronized (lock) {1331lock.foo();1332}13331334synchronized (lock) {1335lock.foo();1336}13371338synchronized (lock) {1339lock.foo();1340}13411342synchronized (lock) {1343lock.foo();1344}13451346synchronized (lock) {1347lock.foo();1348}13491350synchronized (lock) {1351lock.foo();1352}13531354// Footer1355synchronized (lock) {1356lock.foo();13571358done = true;13591360lock.notify();1361}1362}1363try {1364t2.join();1365} catch (InterruptedException e) {1366}1367}1368}13691370/**1371* Thread that tries to acquire lock during lock coarsening.1372* If it unable to do it then lock coarsening occurred.1373*/1374private static class Thread_2 extends Thread {1375private Dummy lock;13761377public Thread_2(Dummy lock) {1378this.lock = lock;1379}13801381public void run() {1382Dummy lock = this.lock;13831384synchronized (lock) {1385if (!done) {1386while (!start) {1387try {1388lock.wait();1389} catch (InterruptedException e) {1390System.out.println("Interrupted!");1391}1392}13931394if (!done) {1395done = true;13961397acquiredLock = true;13981399if (realrun) {1400System.out.println("Acquired lock at " + lock.counter + " iteration of " + currentChance + " chance");1401} else if (eliminateLocks) {1402//forcibly stop warm-up as we see that lock coarsening occurs1403Helper.allowExec = true;1404}14051406}1407}1408}1409}1410}14111412/**1413* Helper class to make method Thread_1.doit() be compiled.1414*/1415public static class Helper {1416public static volatile boolean allowExec = false;1417private static int iterations = 10000;14181419public static void callMethod(Thread_1 t, Dummy lock) {1420for (int i = 0; i < iterations; ++i) {1421t.doit(lock);1422if (allowExec)1423break;1424}1425}1426}14271428/**1429* Class to count number of synchronized statement.1430* If test fails Dummy.counter shows iteration when lock coarsening did not happen1431*/1432public static class Dummy {1433public volatile int counter = 0;14341435public void foo() {1436if (done)1437return;14381439while (t2.getState() != Thread.State.BLOCKED && t2.getState() != Thread.State.WAITING) {1440this.notifyAll();14411442Thread.yield();1443}14441445this.notifyAll();14461447while (t2.getState() != Thread.State.BLOCKED) {1448Thread.yield();1449}14501451++counter;14521453Thread.yield();1454Thread.yield();1455Thread.yield();1456Thread.yield();1457Thread.yield();1458Thread.yield();1459Thread.yield();1460Thread.yield();1461Thread.yield();1462Thread.yield();1463Thread.yield();1464Thread.yield();1465Thread.yield();1466Thread.yield();1467Thread.yield();1468Thread.yield();1469Thread.yield();1470Thread.yield();1471Thread.yield();1472Thread.yield();1473}1474}1475}147614771478