2015-01-12 4 views
0

Есть ли способ рассказать JVM о том, что класс используется исключительно из одного потока => JVM разрешено оптимизировать операции с полями (нагрузками/хранилищами) кросс-синхронными действиями?Java-поток локального класса

ответ

1

Нет. Это режим работы по умолчанию. Вот почему вам нужно сделать дополнительные шаги (например, volatile или synchronized), когда не работает с одной нитью.

+0

Причина, по которой я знаю, что это значение по умолчанию, но, возможно, есть взломать JVM: «Я ЗНАЮ, что это небезопасно, но, пожалуйста, оптимизируйте поля ops в этом классе независимо от синхронизации»? – leventov

+0

Какова ваша фактическая проблема? – Kayaman

+0

класс выполняет синхронизацию для доступа к некоторым ресурсам из другого класса, тогда как * сам * он строго-нить-локальный (полученный из 'ThreadLocal' и' ownerThread == Thread.currentThread() 'проверка выполняется для каждой операции). Итак, что у меня есть: 1) много полевых нагрузок 2) синхронизация на внешнем ресурсе 3) много полевых нагрузок. Я не хочу, чтобы JVM повторял нагрузки без реальной необходимости. – leventov

0

Есть ли способ сказать JVM, что класс используются исключительно из одной нити

Вы не можете явно указать его, но при определенных обстоятельствах горячей точки JVM может сделать вывод, что объекты не могут возможно, видятся другими потоками и выполняются такие оптимизации, как разбиение/распределение объектов и распределение блокировки.

Эта функция называется escape analysis.

+0

Объект протекает через defenition, в ThreadLocalMap. Объект слишком велик, методы большие, а абстракции слишком глубокие, поэтому я не рискую выделить его, надеясь, что jit выполнит EA. – leventov

+0

Затем вам нужно либо переконфигурировать свой код, чтобы он не убежал, либо вам придется искать другие способы оптимизации производительности. – the8472