Integrated: 8266310: deadlock between System.loadLibrary and JNI FindClass loading another class

Aleksei Voitylov avoitylov at openjdk.java.net
Tue Jul 6 11:18:55 UTC 2021


On Tue, 11 May 2021 13:10:30 GMT, Aleksei Voitylov <avoitylov at openjdk.org> wrote:

> Please review this PR which fixes the deadlock in ClassLoader between the two lock objects - a lock object associated with the class being loaded, and the ClassLoader.loadedLibraryNames hash map, locked during the native library load operation.
> 
> Problem being fixed:
> 
> The initial reproducer demonstrated a deadlock between the JarFile/ZipFile and the hash map. That deadlock exists even when the ZipFile/JarFile lock is removed because there's another lock object in the class loader, associated with the name of the class being loaded. Such objects are stored in ClassLoader.parallelLockMap. The deadlock occurs when JNI_OnLoad() loads exactly the same class, whose signature is being verified in another thread.
> 
> Proposed fix:
> 
> The proposed patch suggests to get rid of locking loadedLibraryNames hash map and synchronize on each entry name, as it's done with class names in see ClassLoader.getClassLoadingLock(name) method.
> 
> The patch introduces nativeLibraryLockMap which holds the lock objects for each library name, and the getNativeLibraryLock() private method is used to lazily initialize the corresponding lock object. nativeLibraryContext was changed to ThreadLocal, so that in any concurrent thread it would have a NativeLibrary object on top of the stack, that's being currently loaded/unloaded in that thread. nativeLibraryLockMap accumulates the names of all native libraries loaded - in line with class loading code, it is not explicitly cleared.
> 
> Testing:  jtreg and jck testing with no regressions. A new regression test was developed.

This pull request has now been integrated.

Changeset: e47803a8
Author:    Aleksei Voitylov <avoitylov at openjdk.org>
Committer: Alexander Scherbatiy <alexsch at openjdk.org>
URL:       https://git.openjdk.java.net/jdk/commit/e47803a84feb6d831c6c6158708d29b4fffc99c9
Stats:     913 lines in 10 files changed: 894 ins; 1 del; 18 mod

8266310: deadlock between System.loadLibrary and JNI FindClass loading another class

Reviewed-by: dholmes, plevart, chegar, mchung

-------------

PR: https://git.openjdk.java.net/jdk/pull/3976


More information about the core-libs-dev mailing list