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
已同步。
我不知道我是否可以更改代碼,所以它可能會做嘗試找到想要的PlanetInfo
。第一個 嘗試將是異步,和(如果找不到然後做)第二個同步。 so ...方法getPlanetInfo
將執行與方法internal_getPlanetInfo
不同的for-loop。因此,大多數時候線程不會互相鎖定。
我記住的事情是,一個線程可能有一個「陳舊」 - Infos.planets
,但是!這個「過時」拷貝的唯一潛在問題是它錯過了一段時間後添加的項目。所以如果找不到所需的項目,我們使用「master」 -copy來查找它。
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);
}
任何意見將不勝感激!
ido。