public class PlanetInfo {
String planetName="";
int a;
int b;
int c;
PlanetInfo(planetname){
planetName = planetname;
if(planetName.equals("earth")){
a=1;
//....
}
else if(planetName.equals("mars")){
a=2;
//....
}
}
}
public final class Infos {
static final LinkedList<PlanetInfo> planets = new LinkedList<PlanetInfo>();
private static synchronized PlanetInfo internal_getPlanetInfo(String planetName){
for(int i=0;i<planets.size();i++){
if(planets.get(i).planetName.equals(planetName)){
//return existing PlanetInfo:
return planets.get(i);
}
}
//if not found then create and return a new one:
return new PlanetInfo(planetName);
}
public static PlanetInfo getPlanetInfo(String planetName){
return internal_getPlanetInfo(planetName);
}
}
public class Foo {
PlanetInfo planetinfo = null;
public Foo(aplanet){
planetInfo = Infos.getPlanetInfo(aplanet);
}
public void dosomthing(){
if(planetInfo.a==1){//please, do not wonder about thread-safe here, it's just a simplification...
// etc....
}
}
}
创造新需求的情况很少见PlanetInfo
,但它确实发生了。一旦PlanetInfo
创建并添加到Infos.planets
,它永远不会被删除。大多数时候,Infos.planets
实际上是只读的。
有很多线程都有 的实例Foo
,它们都需要一个指向PlanetInfo
对象的指针。如您所见,internal_getPlanetInfo
是同步的。
我想知道我是否可以更改代码,所以它可能会尝试2 次来找到所需的PlanetInfo
. 第一次尝试将是Asynchronously,并且(如果没有找到那么做)第二次synchronously。所以......该方法getPlanetInfo
将执行与方法相同的for循环internal_getPlanetInfo
。因此,大多数时候线程不会相互锁定。
我想到的是一个线程可能有一个“陈旧”的副本Infos.planets
,但是!这个“陈旧”副本的唯一潜在问题是它错过了一段时间后添加的项目。因此,如果找不到所需的项目,那么我们使用“主”副本查找它。
public static PlanetInfo getPlanetInfo(String planetName){
//try to find it Asynchronously:
for(int i=0;i<planets.size();i++){
if(planets.get(i).planetName.equals(planetName)){
return planets.get(i);
}
}
//if not found then do it synchronously:
return internal_getPlanetInfo(planetName);
}
任何意见将不胜感激!
我做。