gpt4 book ai didi

java - 多线程访问非同步Map

转载 作者:行者123 更新时间:2023-12-01 18:27:36 25 4
gpt4 key购买 nike

我面临这个问题,我有两个类 A 和 B,“A 类”有两个线程 t1 和 t2,它尝试访问“B 类”映射,如下所示,现在的问题是,我无法进行任何更改在 B 类映射上,因此我不能使用 synchronized 关键字,或者我不能将其放入同步方法中。所以我的疑问是,是否有其他方法可以同步此 map 。

public class A{

static B b = new B();

public static void main(String[] args) {
Thread t1 = new Thread(new Runnable() {

@Override
public void run() {

Map<Integer,String> map = Collections.synchronizedMap(b.getMap());
map.put(1, "one");
map.put(2, "two");
map.put(3, "three");
b.setMap(map);
}
});

Thread t2 = new Thread(new Runnable() {
@Override
public void run() {

Map<Integer,String> map = Collections.synchronizedMap(b.getMap());
map.put(4, "four");
map.put(5, "five");
map.put(6, "six");
b.setMap(map);

}
});

t1.start();
t2.start();
try {
t1.join();
t2.join();
} catch (InterruptedException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}


for(Map.Entry<Integer, String> entry : b.getMap().entrySet()){
System.out.println(entry.getKey() + ":" + entry.getValue());
}
}

我使用LinkedHashMap,仅用于跟踪插入顺序(忽略性能问题)

public class B{

private Map<Integer,String> map = new LinkedHashMap<Integer,String>();

public Map<Integer,String> getMap() {
return map;
}

public void setMap(Map<Integer,String> map) {
this.map = map;
}
}

最佳答案

您可以创建一次同步 Map 并让两个线程都使用该一个 Map 实例。

final Map<Integer,String> map = Collections.synchronizedMap(b.getMap());
b.setMap(map);

Thread t1 = new Thread(new Runnable() {

@Override
public void run() {
map.put(1, "one");
map.put(2, "two");
map.put(3, "three");
}
});

Thread t2 = new Thread(new Runnable() {
@Override
public void run() {
map.put(4, "four");
map.put(5, "five");
map.put(6, "six");
}
});

关于java - 多线程访问非同步Map,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/25533908/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com