Блок потока при загрузке класса

Заблокировано много потоков

    "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;
    }
}

Кто-нибудь случайно знал, о чем эта проблема?

Вы используете SimpleDateFormat?

Rcordoval 21.10.2018 10:43

Да, вы можете проверить CachingDateFormatter, который я только что вставил выше, sdf - это SimpleDateFormat, инициализированный в конструкторе CachingDateFormatter.

Levin 21.10.2018 11:00

Вроде все нормально, в каком-то смысле «хорошо». Поток, удерживающий блокировку, имеет статус RUNNABLE, что означает, что он делает успехи. Конечно, для многопоточной программы на SMP-машине не очень эффективно иметь все потоки, ожидающие одного потока, но это неотъемлемое свойство такого кеша; если бы каждый поток вместо этого использовал свой собственный экземпляр средства форматирования даты, программа потребляла бы на несколько килобайт больше ОЗУ, но не требовала бы синхронизации.

Holger 22.10.2018 20:05
Пользовательский скаляр GraphQL
Пользовательский скаляр GraphQL
Листовые узлы системы типов GraphQL называются скалярами. Достигнув скалярного типа, невозможно спуститься дальше по иерархии типов. Скалярный тип...
Как вычислять биты и понимать побитовые операторы в Java - объяснение с примерами
Как вычислять биты и понимать побитовые операторы в Java - объяснение с примерами
В компьютерном программировании биты играют важнейшую роль в представлении и манипулировании данными на двоичном уровне. Побитовые операции...
Поднятие тревоги для долго выполняющихся методов в Spring Boot
Поднятие тревоги для долго выполняющихся методов в Spring Boot
Приходилось ли вам сталкиваться с требованиями, в которых вас могли попросить поднять тревогу или выдать ошибку, когда метод Java занимает больше...
Полный курс Java для разработчиков веб-сайтов и приложений
Полный курс Java для разработчиков веб-сайтов и приложений
Получите сертификат Java Web и Application Developer, используя наш курс.
2
3
461
1

Ответы 1

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

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

Другие вопросы по теме