Java:NumberFormat的同步问题?

Div*_*ero 19 java

我只使用java.text.NumberFormat将数字转换为更易读的字符串,用逗号分隔数千个等等.基本上我将其定义为:

public static NumberFormat nf = NumberFormat.getInstance(Locale.US);
Run Code Online (Sandbox Code Playgroud)

...然后我在任何线程中调用nf.format(some_number),我想在其中创建一个数字的可读版本.但是看看JavaDoc,它说:"数字格式通常不同步.建议为每个线程创建单独的格式实例.如果多个线程同时访问一个格式,它必须在外部同步."

如果我只使用NumberFormat对象的格式(数字)方法,是否会出现同步问题?我尝试使用NumberFormat.getInstance(Locale.US).format(number),但是每次我觉得可能不需要时,都会产生相关的开销.这真的需要外部同步吗?或者,如果没有NumberFormat,是否有更简单有效的方法来完成同样的事情?

谢谢!

Ada*_*ume 21

即使格式是您调用的唯一方法,它仍然不是线程安全的.事实上,由于这个原因,我们在工作中遇到了错误.我们通常会动态创建NumberFormat对象,或者使用Gerco建议的ThreadLocal.如果你想得到想象,你可以继承NumberFormat并在format方法中,在委托NumberFormat上调用format之前进行同步,或者使用ThreadLocal来检索委托.

但是,我认为最简单的方法,特别是如果你要连续格式化/解析几个数字,就是手动使用ThreadLocal.


Ger*_*ies 12

使用ThreadLocal <NumberFormat>.这样每个线程都将拥有它自己的私有NumberFormat实例,并且不需要同步,只需要最小的开销.