# HG changeset patch # User valeriep # Date 1300239755 25200 # Node ID 23f273e43be9be46be07f6c460853fba52f694d9 # Parent b98f18278dc4ea1ab6cc75d8bb21a2a199a5b010 7001933: Deadlock in java.lang.classloader.getPackage() Summary: Modified to not holding the "packages" lock when calling parent CL. Reviewed-by: dholmes, alanb diff -r b98f18278dc4 -r 23f273e43be9 jdk/src/share/classes/java/lang/ClassLoader.java --- a/jdk/src/share/classes/java/lang/ClassLoader.java Tue Mar 15 13:15:31 2011 +0000 +++ b/jdk/src/share/classes/java/lang/ClassLoader.java Tue Mar 15 18:42:35 2011 -0700 @@ -1,5 +1,5 @@ /* - * Copyright (c) 1994, 2010, Oracle and/or its affiliates. All rights reserved. + * Copyright (c) 1994, 2011, Oracle and/or its affiliates. All rights reserved. * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. * * This code is free software; you can redistribute it and/or modify it @@ -1626,20 +1626,28 @@ * @since 1.2 */ protected Package getPackage(String name) { + Package pkg; synchronized (packages) { - Package pkg = packages.get(name); - if (pkg == null) { - if (parent != null) { - pkg = parent.getPackage(name); - } else { - pkg = Package.getSystemPackage(name); - } - if (pkg != null) { - packages.put(name, pkg); + pkg = packages.get(name); + } + if (pkg == null) { + if (parent != null) { + pkg = parent.getPackage(name); + } else { + pkg = Package.getSystemPackage(name); + } + if (pkg != null) { + synchronized (packages) { + Package pkg2 = packages.get(name); + if (pkg2 == null) { + packages.put(name, pkg); + } else { + pkg = pkg2; + } } } - return pkg; } + return pkg; } /**