У меня есть реализация кеша:
class X
{
private final Map<String, ConcurrentMap<String, String>> structure = new HashMap...();
public String getValue(String context, String id)
{
// just assume for this example that there will be always an innner map
final ConcurrentMap<String, String> innerStructure = structure.get(context);
String value = innerStructure.get(id);
if(value == null)
{
synchronized(structure)
{
// can I be sure, that this inner map will represent the last updated
// state from any thread?
value = innerStructure.get(id);
if(value == null)
{
value = getValueFromSomeSlowSource(id);
innerStructure.put(id, value);
}
}
}
return value;
}
}
Является ли эта реализация поточно-ориентированной?Могу ли я быть уверен, что последнее состояние обновлено из какого-либо потока внутри синхронизированного блока?Изменится ли это поведение, если я использую java.util.concurrent.ReentrantLock вместо синхронизированного блока, например:
...
if(lock.tryLock(3, SECONDS))
{
try
{
value = innerStructure.get(id);
if(value == null)
{
value = getValueFromSomeSlowSource(id);
innerStructure.put(id, value);
}
}
finally
{
lock.unlock();
}
}
...
Я знаю, что конечные элементы экземпляра синхронизируются между потоками, но верно ли этообъекты, которыми владеют эти члены?
Может быть, это глупый вопрос, но я не знаю, как это проверить, чтобы убедиться, что он работает на каждой ОС и каждой архитектуре.