java - BigDecimal compareTo() 线程安全

标签 java thread-safety bigdecimal compareto

我有一个 Java 应用程序,它使用 BigDecimal 类的 compareTo() 方法来分类一个(大)实数,读取为一个字符串,根据到它的类型(基本上,“太大”,double 或 float)。应用程序每秒读取大量此类字符串,因此任何性能优化都是必不可少的。

以下是代码的简短摘录:

static final BigDecimal MAX_LONG    = new BigDecimal(Long.MAX_VALUE);
static final BigDecimal MAX_FLOAT   = new BigDecimal(Float.MAX_VALUE);
static final BigDecimal MAX_DOUBLE  = new BigDecimal(Double.MAX_VALUE);

String value = readValue(); // Read the number as a string

BigDecimal number = new BigDecimal(value);

if (number.compareTo(MAX_DOUBLE) > 0)
{
    ...
}
else if (number.compareTo(MAX_FLOAT) > 0)
{
    ...
}
else if (number.compareTo(MAX_LONG) > 0)
{
    ...
}

那么,2 个问题

  1. 在多线程环境中,进行上述比较是否安全(给定静态字段)?
  2. 是否有任何线程安全且更快的方法来实现上述分类?

最佳答案

由于 BigDecimal 是不可变的,因此它也是线程安全的。

您还应该自始至终使用 BigDecimal.valueOf() 而不是 new BigDecimal(),以利用任何可能的缓存。

关于java - BigDecimal compareTo() 线程安全,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/13130783/

相关文章:

scala - 序列化问题 "scala.math.BigDecimal does not have a no-arg default constructor"

java - 这个BigDecimal计算有没有错误?

java - mysqldump 在 java 中不起作用

java - 将查询列表插入组合框的问题

java - 为什么在vertx的Handlebars库中调用Synchronize?

c++ - 从 std::deque 线程安全地同时调用 emplace_back() 和 operator[]() 吗?

java - 使用 setIndexedQuery 获取索引数据,其中索引不是路径末尾

java - 如何得分然后将它们全部加起来

java - 创建太多线程有什么缺点吗?

java - 在 Java 中四舍五入到最接近的 0.05 的最佳方法