我有一个缓存,我使用simeple HashMap实现.喜欢 -
HashMap<String,String> cache = new HashMap<String,String>();
Run Code Online (Sandbox Code Playgroud)
大多数时候使用此缓存来从中读取值.我有另一个方法重新加载缓存,在这个方法内部我基本上创建一个新的缓存,然后分配引用.据我所知,对象引用的赋值是Java中的Atomic.
public class myClass {
private HashMap<String,String> cache = null;
public void init() {
refreshCache();
}
// this method can be called occasionally to update the cache.
public void refreshCache() {
HashMap<String,String> newcache = new HashMap<String,String>();
// code to fill up the new cache
// and then finally
cache = newcache; //assign the old cache to the new one in Atomic way
}
}
Run Code Online (Sandbox Code Playgroud)
我理解如果我不将缓存声明为volatile,其他线程将无法看到更改,但对于我的用例将缓存中的更改传播到其他线程并且它们可以继续使用旧缓存并不是时间关键延长时间.
你看到任何线程问题吗?考虑到许多线程正在从缓存中读取,并且有时只重新加载缓存.
编辑 - 我的主要困惑是我不必在这里使用AtomicReference,因为赋值操作本身是原子的?
编辑 - 我理解为了使顺序正确,我应该将缓存标记为volatile.但是如果refreshCache方法被标记为synchronized,我不必将缓存设置为volatile,因为Synchronized块将负责排序和可见性?
我想产生这个链接:
<a href="/settings" class="button"><span class="magnifier icon"></span>Search</a>
Run Code Online (Sandbox Code Playgroud)
所以据我所知,我必须转换
<%= link_to "Upgrade", :settings, :class => "button" %>
Run Code Online (Sandbox Code Playgroud)
到了一个区块,但当我这样做时:
<%= link_to "Upgrade", :settings, :class => "button" do %>
<span class="magnifier icon">Search</span>
<% end %>
Run Code Online (Sandbox Code Playgroud)
它给了我以下错误:
undefined method `stringify_keys' for :settings:Symbol
Run Code Online (Sandbox Code Playgroud)
但是,当我这样做时:<%= link_to "Upgrade", :settings, :class => "button" %>它完美无缺.
如何将其转换为块?
以下程序在Windows下的Visual Studio 2008中编译,包括字符集"使用Unicode字符集"和"使用多字节字符集".但是,它不能在Ubuntu 10.04.2 LTS 64位和GCC 4.4.3下编译.我在两种环境下使用Boost 1.46.1.
#include <boost/filesystem/path.hpp>
#include <iostream>
int main() {
boost::filesystem::path p(L"/test/test2");
std::wcout << p.native() << std::endl;
return 0;
}
Run Code Online (Sandbox Code Playgroud)
Linux下的编译错误是:
test.cpp:6:错误:'std :: wcout << p.boost :: filesystem3 :: path :: native()'中'operator <<'不匹配
在我看来,Linux下的boost :: filesystem在path :: native()中没有提供宽字符串,尽管boost :: filesystem :: path已经用宽字符串初始化了.此外,我猜这是因为Linux默认为UTF-8,Windows默认为UTF-16.
所以我的第一个问题是,如何在两个平台上编写一个使用boost :: filesystem并支持Unicode路径的程序?
第二个问题:当我在Windows下运行该程序时,它输出:
/test/test2
Run Code Online (Sandbox Code Playgroud)
我的理解是native()方法应该在Windows下将路径转换为本机格式,它使用反斜杠而不是正斜杠.为什么字符串以POSIX格式出现?
template <typename T> 和之间的区别是什么template <class T>.对我来说,两者都产生了相同的结果.
例如
template <class T>
T Average(T *atArray, int nNumValues)
{
T tSum = 0;
for (int nCount=0; nCount < nNumValues; nCount++)
tSum += atArray[nCount];
tSum /= nNumValues;
return tSum;
}
Run Code Online (Sandbox Code Playgroud)
如果我把它改成它 template <typename T>就是一样的
我正在尝试在ubuntu上安装MS SQL JDBC驱动程序,以与sqoop for Hadoop一起使用。我对Java和Linux完全陌生,所以我不确定将所有内容提取到哪里。
我有一个页面接受来自远程站点的POST.我想检测这些POST来自哪个域.我意识到它可以被欺骗,但它总比没有好.我试过访问HTTP_REFERER变量,但它只返回null.
该页面接受来自PayPal(即时付款通知)和其他支付网关等来源的POST.
我如何获得推荐电话?
我是新手使用"乐观锁定"机制 - 我使用的是hibernate(在Jboss中)和容器管理事务(CMT).我想在我的实体读取和实体更新之间处理这种情况,其他人在DB中更新同一个实体(即行).在这种情况下,我想抛出异常..
我用@Version注释了我的实体 - 就像
@Version
private Long version;
Run Code Online (Sandbox Code Playgroud)
现在,我很困惑,如果这对于版本管理来说已经足够了,或者我需要显式调用EntityManager.lock()api之类的
{
.
.
final QueryDTO queryDTO = entityManager.find(QueryDTO.class, id);
entityManager.lock(queryDTO, LockModeType.READ);
queryDTO.setStatus(updatedStatus);
entityManager.persist(queryDTO);
}
Run Code Online (Sandbox Code Playgroud)
提前致谢,