Skip to content

RestartClassLoader doesn't use synchronization in loadClass method. #12171

@samuelbr

Description

@samuelbr

When classes are loaded in parallel RestartClassLoader causes this exception:

Caused by: java.lang.LinkageError: loader (instance of  org/springframework/boot/devtools/restart/classloader/RestartClassLoader): attempted  duplicate class definition for name: "XXX"
	at java.lang.ClassLoader.defineClass1(Native Method)
	at java.lang.ClassLoader.defineClass(ClassLoader.java:763)
	at java.security.SecureClassLoader.defineClass(SecureClassLoader.java:142)
	at java.net.URLClassLoader.defineClass(URLClassLoader.java:467)
	at java.net.URLClassLoader.access$100(URLClassLoader.java:73)
	at java.net.URLClassLoader$1.run(URLClassLoader.java:368)
	at java.net.URLClassLoader$1.run(URLClassLoader.java:362)
	at java.security.AccessController.doPrivileged(Native Method)
	at java.net.URLClassLoader.findClass(URLClassLoader.java:361)
	at org.springframework.boot.devtools.restart.classloader.RestartClassLoader.findClass(RestartClassLoader.java:165)
	at org.springframework.boot.devtools.restart.classloader.RestartClassLoader.loadClass(RestartClassLoader.java:148)
	at java.lang.ClassLoader.loadClass(ClassLoader.java:357)

It seems that RestartClassLoader.loadClass doesn't use synchronization for loading classes as specified in
https://docs.oracle.com/javase/9/docs/api/java/lang/ClassLoader.html#loadClass-java.lang.String-boolean-

Thanks.

Metadata

Metadata

Assignees

Labels

Type

No type

Projects

No projects

Milestone

Relationships

None yet

Development

No branches or pull requests

Issue actions