我有一個hashmap,其中包含Link對象作爲值,Integer作爲key.which在每秒鐘後得到更新,同時從其他類訪問在一些不同的線程中。我想在更新Value部分(api響應之後的鏈接對象)時使hashmap無法訪問,並在更新完成後使其可訪問。什麼是最好的辦法做到這一點。同時訪問靜態hashmap,同時修改java中的entryset值
class Link{
int id;
int currentBWidth;
//getter and setter
}
public class Cache implements Runnable {
public static HashMap<Integer, Link> linkDetailsMap;//accessed by some other class
static {
initMap();
}
private static void initMap() {
linkDetailsMap = new HashMap<Integer, Link>(667);//needed a hashmap
with fixed size 500
for (int count = 0; count < 500; count++) {
Link link = new Link();
link.setLinkId(count);
link.setCurrentBWidth(count);
linkDetailsMap.put(link.getLinkId(), link);
}
}
@Override
public void run() {
while (true) {
try {
// making a rest appi call and modifying link CurrentBWidth in
// linkDetailsMap
**for(Map.Entry<Integer, Link> entry:linkDetailsMap.entrySet())
Link link = entry.getValue();
link.setCurrentBWidth(//some vallue);
}**
Thread.sleep(1000);
} catch (InterruptedException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
......... ///extra code
}
一個很好的答案,但在這裏有兩個線程的用例的矯枉過正。 –
@TimB你說得對。但是,我幾乎從來沒有聽說過那個漂亮的n讀者/ 1作家鎖,當你知道它存在時,這非常方便。 – Matthieu