我需要在并发多线程环境中从Amazon S3获取一些字符串资源。我想使用Amazon ElastiCache实现缓存。本质上我想实现这样的方法:
String getSomething(key) {
String something = elastiCache.get(key);
if (something == null) {
something = s3.get(key);
elastiCache.put(key, something);
}
return something;
}
问题是在并发环境中,像这样的代码是竞争条件的主体。如果密钥在elastiCache中到期,多个线程将尝试从s3获取它并将其放回elastiCache。避免它的最简单方法是对方法进行同步。这不是最佳的,因为对getSomething的所有调用都将是交错的,并且当值在elastiCache中时将导致情况变慢。我在MemcachedClient上找到了CAS方法:gets / asyncGets和/ asyncCAS。使用这种方法,我可以使它只有在elastiCache中找不到密钥的线程才会将其放回原处。但有没有一种方法可以避免从多个线程访问s3,而不是使用synchronized?
答案 0 :(得分:0)
双重检查锁怎么样?像这样:
String getSomething(key) {
String something = elastiCache.get(key);
if (something == null) {
synchronized(this) {
something = elastiCache.get(key);
if (something == null) {
something = s3.get(key);
elastiCache.put(key, something);
}
}
}
return something;
}