我想編寫一個使用get()方法訪問LinkedHashMap的多線程應用程序(應用程序只使用get()方法從LinkedHashMap獲取數據)。源代碼如下:在多線程應用程序中使用LinkedHashMap的get()方法是否安全
public class Thread1 implements Runnable {
LinkedHashMap<String, ArrayList<GroupMembers>> group;
public Thread1(LinkedHashMap<String, ArrayList<GroupMembers>> _group) {
group = _group
}
public void run() {
while (true) {
Set<String> groupKeyNames = group.keySet();
for (String groupName : groupKeyNames) {
ArrayList<GroupMembers> members = group.get(groupName);
/* Thread 1 processing */
...
}
}
}
}
public class Thread2 implements Runnable {
LinkedHashMap<String, ArrayList<GroupMembers>> group;
public Thread2(LinkedHashMap<String, ArrayList<GroupMembers>> _group) {
group = _group
}
public void run() {
while (true) {
Set<String> groupKeyNames = group.keySet();
for (String groupName : groupKeyNames) {
ArrayList<GroupMembers> members = group.get(groupName);
/* Thread 2 processing */
...
}
}
}
}
public class Sample {
public static void main(String[] args) throws IOException {
/* Init LinkedHashMap */
LinkedHashMap<String, ArrayList<GroupMembers>> group;
group.put("group1", new ArrayList<GroupMembers>());
group.put("group2", new ArrayList<GroupMembers>());
...
Thread1 t1 = new Thread(group);
t1.start();
Thread1 t1 = new Thread(group);
t2.start();
}
}
在上面的多線程應用程序中使用LinkedHashMap.get()是否安全?
如果Map是有效的final_,並且_safely published_(看起來那些),那麼是的,沒有同步就可以get()從它中取出。當兩個或更多線程訪問相同的數據時,線程安全只是一個問題,並且其中一個或多個線程會更新它。 –
此代碼不起作用,因爲您在插入值之前未將值賦給'group'。你如何初始化它? –
爲什麼你得到'keySet',迭代獲取'members'?如果您在迭代過程中需要組名稱,則只需迭代'group.values()'或'group.entrySet()'就會更容易。 –