小编Ric*_*ard的帖子

你在Java中使用volatile关键字吗?

在今天的工作中,我遇到了volatileJava中的关键字.我不太熟悉它,我发现了这个解释:

Java理论与实践:管理波动性

鉴于该文章解释了相关关键字的详细信息,您是否使用过它,或者您是否曾经看到过以正确方式使用此关键字的情况?

java multithreading volatile keyword

628
推荐指数
13
解决办法
24万
查看次数

BigDecimal乘以零

我正在使用BigDecimal进行简单的乘法运算,并且在乘以零时我发现了一些奇怪的行为(在这个用例中乘以零是正确的).

基本数学告诉我,任何乘以零的数字都将等于零(参见:零产品属性乘法属性)

但是,以下代码将始终失败并出现相同的错误:

assertEquals(new BigDecimal(0), new BigDecimal(22.3).multiply(new BigDecimal(0)));
Run Code Online (Sandbox Code Playgroud)
java.lang.AssertionError: 
Expected :0
Actual   :0E-48
Run Code Online (Sandbox Code Playgroud)

这是BigDecimal的不准确,还是我在某处遗漏了数学的一些利基分支?

注意:在IntelliJ 11中运行的JDK 1.6.0_27

java rounding-error bigdecimal numerical-analysis

58
推荐指数
3
解决办法
4377
查看次数

预加载番石榴缓存的值

我有一个要求,我们从数据库加载静态数据以便在Java应用程序中使用.任何缓存机制都应具有以下功能:

  • 从数据库加载所有静态数据(加载后,此数据不会更改)
  • 从数据库加载新数据(启动时数据库中的数据不会改变,但可以添加新数据)

由于应用程序将部署到多个地理位置并且必须与单个数据库通信,因此不能延迟加载所有数据.延迟加载数据将使应用程序位于数据库的不同区域中对特定元素的第一个请求太慢.

我一直在Guava中使用MapMaker API成功,但我们现在正在升级到最新版本,我似乎无法在CacheBuilder API中找到相同的功能; 我似乎无法找到一种在启动时加载所有数据的简洁方法.

一种方法是从数据库加载所有密钥并单独通过Cache加载它们.这可以工作,但会导致对数据库的N + 1调用,这不是我正在寻找的有效解决方案.

public void loadData(){
    List<String> keys = getAllKeys();
    for(String s : keys)
        cache.get(s);
}
Run Code Online (Sandbox Code Playgroud)

或者另一个解决方案是使用ConcurrentHashMap实现并自己处理所有线程和缺少的条目?我并不热衷于这样做,因为MapMaker和CacheBuilder API免费提供基于密钥的线程锁定,而无需提供额外的测试.我也很确定MapMaker/CacheBuilder实现会有一些我不知道/没有时间调查的效率.

public Element get(String key){
    Lock lock = getObjectLock(key);
    lock.lock();
    try{
        Element ret = map.get(key)
        if(ret == null){
            ret = getElement(key); // database call
            map.put(key, e);
        }
        return ret;
    }finally {
        lock.unlock();
    } 
}
Run Code Online (Sandbox Code Playgroud)

谁能想到更好的解决方案来满足我的两个要求?


功能要求

我不认为预加载缓存是一种不常见的要求,因此如果CacheBuilder提供了预加载缓存的配置选项,那将会很好.我认为提供一个接口(很像CacheLoader),它将在启动时填充缓存,这将是一个理想的解决方案,例如:

CacheBuilder.newBuilder().populate(new CachePopulator<String, Element>(){

    @Override
    public Map<String, Element> populate() throws Exception {
        return getAllElements();
    }

}).build(new CacheLoader<String, Element>(){

    @Override …
Run Code Online (Sandbox Code Playgroud)

java caching guava

23
推荐指数
2
解决办法
1万
查看次数

而(false)导致无法访问的语句编译错误

我最近在发布之前从代码库中删除了一段代码,并使用if(false)语句来阻止执行:

if (false) {
    ArrayList<String> list = new ArrayList<String>();
    ...
}
Run Code Online (Sandbox Code Playgroud)

这编译得很好并且会阻止执行有问题的代码块(对或错,这不是当前的参数).

然而,有点意外,我把上面的块改为:

while (false) {
    ArrayList<String> list = new ArrayList<String>();
    ...
}
Run Code Online (Sandbox Code Playgroud)

并收到无法访问的语句编译错误.

我很欣赏编译错误并理解原因,但是,我很难理解这两个块之间的区别以及为什么前者编译得很好但后者在它们都有无法访问的语句时都没有.

java while-loop

14
推荐指数
1
解决办法
713
查看次数

Double!= null导致NullPointerException

我有以下代码片段让我烦恼,其中currentRate和secondCurrentRate是Double对象,正确定义:

(currentRate != null && secondCurrentRate != null) ? currentRate * secondCurrentRate : null;
Run Code Online (Sandbox Code Playgroud)

这应该检查每个Double的null-ness并相应地赋值null.但是,如果secondCurrentRate为null,则会导致NullPointerException.我已将代码段更改为:

(currentRate == null | secondCurrentRate == null) ? null : currentRate * secondCurrentRate;
Run Code Online (Sandbox Code Playgroud)

这可以按预期工作.我的问题是为什么会发生这种情况?如果我在对象上调用某个方法,我可以理解它,但我的理解是当在null对象上调用方法时抛出NullPointerExceptions.有一个null对象,但没有方法调用.

任何人都可以对此提供任何见解吗?这是在Java 5中运行的.

java nullpointerexception

6
推荐指数
1
解决办法
7990
查看次数

测试 ResultSet 以查看它是否包含列标签

是否可以检查 ResultSet 以查看它是否包含当前行的列标签。我认为它由某种 Map 支持,因此提供 rs.contains("label") 方法不会那么昂贵,但我在 javadoc 中找不到。

我目前测试标签存在的方法是:

BigDecimal bid;
    try {
        bid = rs.getBigDecimal("bid");
    }
    catch(final SQLException e) {
        bid = null;
    }
Run Code Online (Sandbox Code Playgroud)

但这对我来说似乎不整洁,如果您想以这种方式测试多行,它将无法读取。

java jdbc resultset

2
推荐指数
1
解决办法
5155
查看次数