Bug4518797.java revision 0
51607ea01068c9047391e4c8b46bc9dbd0edb7fdmark/*
51607ea01068c9047391e4c8b46bc9dbd0edb7fdmark * Copyright (c) 2007 Sun Microsystems, Inc. All Rights Reserved.
51607ea01068c9047391e4c8b46bc9dbd0edb7fdmark * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
51607ea01068c9047391e4c8b46bc9dbd0edb7fdmark *
51607ea01068c9047391e4c8b46bc9dbd0edb7fdmark * This code is free software; you can redistribute it and/or modify it
51607ea01068c9047391e4c8b46bc9dbd0edb7fdmark * under the terms of the GNU General Public License version 2 only, as
51607ea01068c9047391e4c8b46bc9dbd0edb7fdmark * published by the Free Software Foundation.
51607ea01068c9047391e4c8b46bc9dbd0edb7fdmark *
51607ea01068c9047391e4c8b46bc9dbd0edb7fdmark * This code is distributed in the hope that it will be useful, but WITHOUT
51607ea01068c9047391e4c8b46bc9dbd0edb7fdmark * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
51607ea01068c9047391e4c8b46bc9dbd0edb7fdmark * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License
51607ea01068c9047391e4c8b46bc9dbd0edb7fdmark * version 2 for more details (a copy is included in the LICENSE file that
51607ea01068c9047391e4c8b46bc9dbd0edb7fdmark * accompanied this code).
51607ea01068c9047391e4c8b46bc9dbd0edb7fdmark *
51607ea01068c9047391e4c8b46bc9dbd0edb7fdmark * You should have received a copy of the GNU General Public License version
51607ea01068c9047391e4c8b46bc9dbd0edb7fdmark * 2 along with this work; if not, write to the Free Software Foundation,
51607ea01068c9047391e4c8b46bc9dbd0edb7fdmark * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA.
51607ea01068c9047391e4c8b46bc9dbd0edb7fdmark *
51607ea01068c9047391e4c8b46bc9dbd0edb7fdmark * Please contact Sun Microsystems, Inc., 4150 Network Circle, Santa Clara,
51607ea01068c9047391e4c8b46bc9dbd0edb7fdmark * CA 95054 USA or visit www.sun.com if you need additional information or
51607ea01068c9047391e4c8b46bc9dbd0edb7fdmark * have any questions.
51607ea01068c9047391e4c8b46bc9dbd0edb7fdmark */
51607ea01068c9047391e4c8b46bc9dbd0edb7fdmark/*
51607ea01068c9047391e4c8b46bc9dbd0edb7fdmark * @test
51607ea01068c9047391e4c8b46bc9dbd0edb7fdmark * @bug 4518797
51607ea01068c9047391e4c8b46bc9dbd0edb7fdmark * @summary Make sure that hashCode() and read/writeObject() are thread-safe.
51607ea01068c9047391e4c8b46bc9dbd0edb7fdmark * @run main/timeout=200 Bug4518797
51607ea01068c9047391e4c8b46bc9dbd0edb7fdmark */
51607ea01068c9047391e4c8b46bc9dbd0edb7fdmark
51607ea01068c9047391e4c8b46bc9dbd0edb7fdmarkimport java.util.*;
51607ea01068c9047391e4c8b46bc9dbd0edb7fdmarkimport java.io.*;
51607ea01068c9047391e4c8b46bc9dbd0edb7fdmark
51607ea01068c9047391e4c8b46bc9dbd0edb7fdmarkpublic class Bug4518797 {
51607ea01068c9047391e4c8b46bc9dbd0edb7fdmark static volatile boolean runrun = true;
51607ea01068c9047391e4c8b46bc9dbd0edb7fdmark static volatile String message = null;
51607ea01068c9047391e4c8b46bc9dbd0edb7fdmark
51607ea01068c9047391e4c8b46bc9dbd0edb7fdmark public static void main(String[] args) {
51607ea01068c9047391e4c8b46bc9dbd0edb7fdmark final Locale loc = new Locale("ja", "US");
51607ea01068c9047391e4c8b46bc9dbd0edb7fdmark final int hashcode = loc.hashCode();
51607ea01068c9047391e4c8b46bc9dbd0edb7fdmark
51607ea01068c9047391e4c8b46bc9dbd0edb7fdmark System.out.println("correct hash code: " + hashcode);
51607ea01068c9047391e4c8b46bc9dbd0edb7fdmark Thread t1 = new Thread(new Runnable() {
51607ea01068c9047391e4c8b46bc9dbd0edb7fdmark public void run() {
51607ea01068c9047391e4c8b46bc9dbd0edb7fdmark while (runrun) {
51607ea01068c9047391e4c8b46bc9dbd0edb7fdmark int hc = loc.hashCode();
51607ea01068c9047391e4c8b46bc9dbd0edb7fdmark if (hc != hashcode) {
51607ea01068c9047391e4c8b46bc9dbd0edb7fdmark runrun = false;
51607ea01068c9047391e4c8b46bc9dbd0edb7fdmark message = "t1: wrong hashcode: " + hc;
51607ea01068c9047391e4c8b46bc9dbd0edb7fdmark }
51607ea01068c9047391e4c8b46bc9dbd0edb7fdmark }
51607ea01068c9047391e4c8b46bc9dbd0edb7fdmark }
51607ea01068c9047391e4c8b46bc9dbd0edb7fdmark });
51607ea01068c9047391e4c8b46bc9dbd0edb7fdmark
51607ea01068c9047391e4c8b46bc9dbd0edb7fdmark Thread t2 = new Thread(new Runnable() {
51607ea01068c9047391e4c8b46bc9dbd0edb7fdmark public void run() {
51607ea01068c9047391e4c8b46bc9dbd0edb7fdmark // Repeat serialization and deserialization. And get the
51607ea01068c9047391e4c8b46bc9dbd0edb7fdmark // hash code from a deserialized Locale object.
51607ea01068c9047391e4c8b46bc9dbd0edb7fdmark while (runrun) {
51607ea01068c9047391e4c8b46bc9dbd0edb7fdmark try {
51607ea01068c9047391e4c8b46bc9dbd0edb7fdmark ByteArrayOutputStream baos = new ByteArrayOutputStream();
51607ea01068c9047391e4c8b46bc9dbd0edb7fdmark ObjectOutputStream oos = new ObjectOutputStream(baos);
51607ea01068c9047391e4c8b46bc9dbd0edb7fdmark oos.writeObject(loc);
51607ea01068c9047391e4c8b46bc9dbd0edb7fdmark byte[] b = baos.toByteArray();
51607ea01068c9047391e4c8b46bc9dbd0edb7fdmark oos.close();
51607ea01068c9047391e4c8b46bc9dbd0edb7fdmark ByteArrayInputStream bais = new ByteArrayInputStream(b);
51607ea01068c9047391e4c8b46bc9dbd0edb7fdmark ObjectInputStream ois = new ObjectInputStream(bais);
51607ea01068c9047391e4c8b46bc9dbd0edb7fdmark Locale loc2 = (Locale) ois.readObject();
51607ea01068c9047391e4c8b46bc9dbd0edb7fdmark int hc = loc2.hashCode();
51607ea01068c9047391e4c8b46bc9dbd0edb7fdmark if (hc != hashcode) {
51607ea01068c9047391e4c8b46bc9dbd0edb7fdmark runrun = false;
51607ea01068c9047391e4c8b46bc9dbd0edb7fdmark message = "t2: wrong hashcode: " + hc;
51607ea01068c9047391e4c8b46bc9dbd0edb7fdmark }
51607ea01068c9047391e4c8b46bc9dbd0edb7fdmark } catch (IOException ioe) {
51607ea01068c9047391e4c8b46bc9dbd0edb7fdmark runrun = false;
51607ea01068c9047391e4c8b46bc9dbd0edb7fdmark throw new RuntimeException("t2: can't perform test", ioe);
51607ea01068c9047391e4c8b46bc9dbd0edb7fdmark } catch (ClassNotFoundException cnfe) {
51607ea01068c9047391e4c8b46bc9dbd0edb7fdmark runrun = false;
51607ea01068c9047391e4c8b46bc9dbd0edb7fdmark throw new RuntimeException("t2: can't perform test", cnfe);
51607ea01068c9047391e4c8b46bc9dbd0edb7fdmark }
51607ea01068c9047391e4c8b46bc9dbd0edb7fdmark }
51607ea01068c9047391e4c8b46bc9dbd0edb7fdmark }
51607ea01068c9047391e4c8b46bc9dbd0edb7fdmark });
51607ea01068c9047391e4c8b46bc9dbd0edb7fdmark
51607ea01068c9047391e4c8b46bc9dbd0edb7fdmark t1.start();
51607ea01068c9047391e4c8b46bc9dbd0edb7fdmark t2.start();
51607ea01068c9047391e4c8b46bc9dbd0edb7fdmark try {
for (int i = 0; runrun && i < 180; i++) {
Thread.sleep(1000);
}
runrun = false;
t1.join();
t2.join();
} catch (InterruptedException e) {
}
if (message != null) {
throw new RuntimeException(message);
}
}
}