Заблокировано много потоков
"My-remoting-thread-12" #784 daemon prio=10 os_prio=0 tid=0x00007f9418071800 nid=0x1861 waiting for monitor entry [0x00007f91de54f000]
java.lang.Thread.State: BLOCKED (on object monitor)
at ch.qos.logback.core.util.CachingDateFormatter.format(CachingDateFormatter.java:45)
- waiting to lock <0x000000074bc00778> (a ch.qos.logback.core.util.CachingDateFormatter)
at ch.qos.logback.classic.pattern.DateConverter.convert(DateConverter.java:61)
at ch.qos.logback.classic.pattern.DateConverter.convert(DateConverter.java:23)
И 0x000000074bc00778 был заблокирован загрузкой класса ResourceBundle:
"My-remoting-thread-5" #769 daemon prio=10 os_prio=0 tid=0x00007f941c011000 nid=0x17d1 runnable [0x00007f91df924000]
java.lang.Thread.State: RUNNABLE
at sun.reflect.ClassDefiner.defineClass(ClassDefiner.java:63)
at sun.reflect.MethodAccessorGenerator$1.run(MethodAccessorGenerator.java:399)
at sun.reflect.MethodAccessorGenerator$1.run(MethodAccessorGenerator.java:394)
at java.security.AccessController.doPrivileged(Native Method)
at sun.reflect.MethodAccessorGenerator.generate(MethodAccessorGenerator.java:393)
at sun.reflect.MethodAccessorGenerator.generateConstructor(MethodAccessorGenerator.java:92)
at sun.reflect.NativeConstructorAccessorImpl.newInstance(NativeConstructorAccessorImpl.java:55)
at sun.reflect.DelegatingConstructorAccessorImpl.newInstance(DelegatingConstructorAccessorImpl.java:45)
at java.lang.reflect.Constructor.newInstance(Constructor.java:423)
at java.lang.Class.newInstance(Class.java:442)
at java.util.ResourceBundle$Control.newBundle(ResourceBundle.java:2655)
at java.util.ResourceBundle.loadBundle(ResourceBundle.java:1511)
at java.util.ResourceBundle.findBundle(ResourceBundle.java:1475)
at java.util.ResourceBundle.findBundle(ResourceBundle.java:1429)
at java.util.ResourceBundle.findBundle(ResourceBundle.java:1429)
at java.util.ResourceBundle.getBundleImpl(ResourceBundle.java:1371)
at java.util.ResourceBundle.getBundle(ResourceBundle.java:900)
at sun.util.resources.LocaleData$1.run(LocaleData.java:167)
at sun.util.resources.LocaleData$1.run(LocaleData.java:163)
at java.security.AccessController.doPrivileged(Native Method)
at sun.util.resources.LocaleData.getBundle(LocaleData.java:163)
at sun.util.resources.LocaleData.getDateFormatData(LocaleData.java:127)
at java.text.DateFormatSymbols.initializeData(DateFormatSymbols.java:710)
at java.text.DateFormatSymbols.<init>(DateFormatSymbols.java:145)
at sun.util.locale.provider.DateFormatSymbolsProviderImpl.getInstance(DateFormatSymbolsProviderImpl.java:85)
at java.text.DateFormatSymbols.getProviderInstance(DateFormatSymbols.java:364)
at java.text.DateFormatSymbols.getInstance(DateFormatSymbols.java:340)
at java.util.Calendar.getDisplayName(Calendar.java:2110)
at java.text.SimpleDateFormat.subFormat(SimpleDateFormat.java:1125)
at java.text.SimpleDateFormat.format(SimpleDateFormat.java:966)
at java.text.SimpleDateFormat.format(SimpleDateFormat.java:936)
at java.text.DateFormat.format(DateFormat.java:345)
at ch.qos.logback.core.util.CachingDateFormatter.format(CachingDateFormatter.java:48)
- locked <0x000000074bc00778> (a ch.qos.logback.core.util.CachingDateFormatter)
at ch.qos.logback.classic.pattern.DateConverter.convert(DateConverter.java:61)
Версия JDK: 1.8.0_152
код CachingDateFormatter в логбэке:
public final String format(long now) {
synchronized (this) {
if (now != lastTimestamp) {
lastTimestamp = now;
cachedStr = sdf.format(new Date(now));
}
return cachedStr;
}
}
Кто-нибудь случайно знал, о чем эта проблема?
Да, вы можете проверить CachingDateFormatter, который я только что вставил выше, sdf - это SimpleDateFormat, инициализированный в конструкторе CachingDateFormatter.
Вроде все нормально, в каком-то смысле «хорошо». Поток, удерживающий блокировку, имеет статус RUNNABLE, что означает, что он делает успехи. Конечно, для многопоточной программы на SMP-машине не очень эффективно иметь все потоки, ожидающие одного потока, но это неотъемлемое свойство такого кеша; если бы каждый поток вместо этого использовал свой собственный экземпляр средства форматирования даты, программа потребляла бы на несколько килобайт больше ОЗУ, но не требовала бы синхронизации.




Скорее всего, существует поток, который удерживает блокировку этого экземпляра, не позволяя другим использовать его.
Я предлагаю использовать DateTimeFormatter, который не нужно блокировать, что позволяет одновременное выполнение.
Вы используете SimpleDateFormat?