Есть ли способ рассказать JVM о том, что класс используется исключительно из одного потока => JVM разрешено оптимизировать операции с полями (нагрузками/хранилищами) кросс-синхронными действиями?Java-поток локального класса
ответ
Нет. Это режим работы по умолчанию. Вот почему вам нужно сделать дополнительные шаги (например, volatile
или synchronized
), когда не работает с одной нитью.
Есть ли способ сказать JVM, что класс используются исключительно из одной нити
Вы не можете явно указать его, но при определенных обстоятельствах горячей точки JVM может сделать вывод, что объекты не могут возможно, видятся другими потоками и выполняются такие оптимизации, как разбиение/распределение объектов и распределение блокировки.
Эта функция называется escape analysis.
Объект протекает через defenition, в ThreadLocalMap. Объект слишком велик, методы большие, а абстракции слишком глубокие, поэтому я не рискую выделить его, надеясь, что jit выполнит EA. – leventov
Затем вам нужно либо переконфигурировать свой код, чтобы он не убежал, либо вам придется искать другие способы оптимизации производительности. – the8472
Причина, по которой я знаю, что это значение по умолчанию, но, возможно, есть взломать JVM: «Я ЗНАЮ, что это небезопасно, но, пожалуйста, оптимизируйте поля ops в этом классе независимо от синхронизации»? – leventov
Какова ваша фактическая проблема? – Kayaman
класс выполняет синхронизацию для доступа к некоторым ресурсам из другого класса, тогда как * сам * он строго-нить-локальный (полученный из 'ThreadLocal' и' ownerThread == Thread.currentThread() 'проверка выполняется для каждой операции). Итак, что у меня есть: 1) много полевых нагрузок 2) синхронизация на внешнем ресурсе 3) много полевых нагрузок. Я не хочу, чтобы JVM повторял нагрузки без реальной необходимости. – leventov