在方法内声明散列映射

0 java multithreading

局部变量在Java中是线程安全的.hashmap在方法线程中使用声明是否安全?例如-

void usingHashMap()
{
    HashMap<Integer> map = new HashMap<integer>();
}
Run Code Online (Sandbox Code Playgroud)

Aug*_*cis 5

当两个线程在这里运行相同的方法时usingHashMap(),它们绝不是相关的.每个都thread将创建自己的每个局部变量的版本,这些变量不会以任何方式相互交互

如果变量不是本地变量,则它们将附加到实例.在这种情况下,运行相同方法的两个线程都看到一个变量,这不是线程安全的.

public class usingHashMapNotThreadSafe {
    HashMap<Integer, String> map = new HashMap<Integer, String>();
    public int work() {
        //manipulating the hashmap here
    }
}

public class usingHashMapThreadSafe {
    public int worksafe() {
        HashMap<Integer, String> map = new HashMap<Integer, String>();
        //manipulating the hashmap here
    }
}
Run Code Online (Sandbox Code Playgroud)

虽然usingHashMapNotThreadSafe在同一个实例上运行的两个线程usingHashMapNotThreadSafe将看到相同的x.这可能很危险,因为线程正试图改变map!在第二个,在同一个实例上运行的两个线程usingHashMapThreadSafe将看到完全不同的x版本,并且不能相互影响.