1 /* 2 * Copyright (c) 2015, 2019, 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 import sun.hotspot.WhiteBox; 26 27 public class LockStringTest extends Thread { 28 static String lock; 29 static boolean done; 30 static WhiteBox wb = WhiteBox.getWhiteBox(); 31 32 public static void main(String[] args) throws Exception { 33 34 if (wb.areSharedStringsIgnored()) { 35 System.out.println("The shared strings are ignored"); 36 System.out.println("LockStringTest: PASS"); 37 return; 38 } 39 40 if (!wb.isShared(LockStringTest.class)) { 41 throw new RuntimeException("Failed: LockStringTest class is not shared."); 42 } 43 44 // Note: This class is archived. All string literals (including the ones used in this class) 45 // in all archived classes are interned into the CDS shared string table. 46 47 doTest("StringLock", false); 48 doTest("", true); 49 50 // The following string has a 0 hashCode. Calling String.hashCode() could cause 51 // the String.hash field to be written into, if so make sure we don't functionally 52 // break. 53 doTest("\u0121\u0151\u00a2\u0001\u0001\udbb2", true); 54 } 55 56 private static void doTest(String s, boolean hasZeroHashCode) throws Exception { 57 lock = s; 58 done = false; 59 60 if (!wb.isShared(lock)) { 61 throw new RuntimeException("Failed: String \"" + lock + "\" is not shared."); 62 } 63 64 if (hasZeroHashCode && lock.hashCode() != 0) { 65 throw new RuntimeException("Shared string \"" + lock + "\" should have 0 hashCode, but is instead " + lock.hashCode()); 66 } 67 68 String copy = new String(lock); 69 if (lock.hashCode() != copy.hashCode()) { 70 throw new RuntimeException("Shared string \"" + lock + "\" does not have the same hashCode as its non-shared copy"); 71 } 72 73 new LockStringTest().start(); 74 75 synchronized(lock) { 76 while (!done) { 77 lock.wait(); 78 } 79 } 80 System.gc(); 81 System.out.println("LockStringTest: PASS"); 82 } 83 84 public void run() { 85 String shared = "LiveOak"; 86 synchronized (lock) { 87 for (int i = 0; i < 100; i++) { 88 new String(shared); 89 System.gc(); 90 try { 91 sleep(5); 92 } catch (InterruptedException e) {} 93 } 94 done = true; 95 lock.notify(); 96 } 97 } 98 }