在多线程应用程序

时间:2016-01-14 17:03:51

标签: java multithreading thread-safety linkedhashmap

我想编写一个使用get()方法访问LinkedHashMap的多线程应用程序(Application仅使用get()方法从LinkedHashMap获取数据)。源代码如下:

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()是否安全?

1 个答案:

答案 0 :(得分:3)

引用Javadoc

  

请注意,此实现未同步。如果多个线程同时访问链接的哈希映射,并且至少有一个线程在结构上修改了映射,则必须在外部进行同步。

     

...

     

在插入顺序链接哈希映射中,仅更改与已包含在映射中的键关联的值不是结构修改。在访问顺序链接哈希映射中,仅使用 get查询地图是结构修改。)

是插入顺序还是访问顺序取决于您实际初始化它的方式 - 这不包括在问题中:

  • 如果您使用new LinkedHashMap(int, float, boolean)构建LinkedHashMap,则可能是按访问顺序的(如果您将true作为布尔参数传递),在这种情况下它将不< / strong>是线程安全的
  • 如果使用任何其他构造函数构造它(或传递false作为布尔参数),它将是线程安全的 - 前提是你也不继续在其他地方使用groups引用