在今天的工作中,我遇到了volatile
Java中的关键字.我不太熟悉它,我发现了这个解释:
鉴于该文章解释了相关关键字的详细信息,您是否使用过它,或者您是否曾经看到过以正确方式使用此关键字的情况?
我正在使用BigDecimal进行简单的乘法运算,并且在乘以零时我发现了一些奇怪的行为(在这个用例中乘以零是正确的).
基本数学告诉我,任何乘以零的数字都将等于零(参见:零产品属性和乘法属性)
但是,以下代码将始终失败并出现相同的错误:
assertEquals(new BigDecimal(0), new BigDecimal(22.3).multiply(new BigDecimal(0)));
Run Code Online (Sandbox Code Playgroud)
Run Code Online (Sandbox Code Playgroud)java.lang.AssertionError: Expected :0 Actual :0E-48
这是BigDecimal的不准确,还是我在某处遗漏了数学的一些利基分支?
注意:在IntelliJ 11中运行的JDK 1.6.0_27
我有一个要求,我们从数据库加载静态数据以便在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) 我最近在发布之前从代码库中删除了一段代码,并使用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)
并收到无法访问的语句编译错误.
我很欣赏编译错误并理解原因,但是,我很难理解这两个块之间的区别以及为什么前者编译得很好但后者在它们都有无法访问的语句时都没有.
我有以下代码片段让我烦恼,其中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中运行的.
是否可以检查 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 ×6
bigdecimal ×1
caching ×1
guava ×1
jdbc ×1
keyword ×1
resultset ×1
volatile ×1
while-loop ×1