如何在多线程应用程序中使用 Locale 来提高性能

2022-09-04 19:51:57

在我的应用程序中,我有一个由多个线程同时调用的方法。每个线程在运行时多次调用此方法。

private Locale trLoc = new Locale("tr", "TR");

public double calculate(String arg1){
    arg1 = arg1.toUpperCase(trLoc);
...
}

此方法进行调用,由于 Locale 类中的用法,该调用会导致瓶颈。每个线程在方法运行时等待另一个线程。这种情况会使我的应用程序速度降低多达三倍。String.toUpperString(Locale)HashTabletoUpperCase

在使用 Locale 时是否遗漏了什么,或者我必须出于相同目的使用另一个类?

提前致谢。


答案 1

经过短暂的探索,看起来JDK无法帮助您。我建议获取类,复制它并修复Hashtable的问题。您可以替换为 。我看不出有任何理由在这里使用。java.lang.ConditionalSpecialCasingHashtableHashMapHashtable


答案 2

编辑:下面的解决方案实际上不起作用,因为类中的问题是静态的,并且仍将由所有线程共享。我建议你接受西布尼克的答案,而不是我的答案。HashTablejava.lang.ConditionalSpecialCasing


一个简单的解决方案是将trLoc a:将为每个线程自动创建一个新实例(根据需要)。如果你有一个线程池或类似的,这将工作正常:你只会创建与池中线程一样多的实例,这应该是相当合理的。由于每个线程将访问 不同的实例,因此您将不再争用访问同步的 HashTable。ThreadLocalLocaleLocale

private ThreadLocal<Locale> trLoc = new ThreadLocal<Locale>() {
    @Override
    protected Locale initialValue() {
        return new Locale("tr", "TR");
    }
};

public double calculate(String arg1){
    arg1 = arg1.toUpperCase(trLoc.get());
    ...
}