我试图找到我的问题的答案,但无法在Google或Java文档中找到它。
在ConcurrentHashMap中的,假设一个线程t1从段n读取,并且在同一个另一个线程t2更新了同一段n:
如果我们的t1读取因为线程t2已更新它而变脏了,那么并发读取的用途是什么?
EdIted:我期待以下节目的结果为12但是它给出2或11.这是关注点。看起来concurrentHashMap不安全。
package katalyst.samples;
import java.util.concurrent.ConcurrentHashMap;
public class SampleCode {
public static void main(String[] args) throws InterruptedException {
ThreadRun r1 = new ThreadRun();
Thread t1 = new Thread(r1);
t1.setName("Thread1");
Thread t2 = new Thread(r1);
t2.setName("Thread2");
t2.start();
t1.start();
t1.join();
t2.join();
System.out.println(r1.getCHM().get("a"));
}
}
class ThreadRun implements Runnable {
ConcurrentHashMap<String, Integer> CHM = null;
public ConcurrentHashMap<String, Integer> getCHM() {
return CHM;
}
ThreadRun() {
CHM = new ConcurrentHashMap<>();
CHM.put("a", 1);
}
@Override
public void run() {
System.out.println(Thread.currentThread().getName());
int value = CHM.get("a");
try {
Thread.sleep(5000);
} catch (InterruptedException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
if (Thread.currentThread().getName().equals("Thread1")) {
// int a = CHM.get("a");
value = value + 1;
CHM.put("a", value);
} else {
// int a = CHM.get("a");
value = value + 10;
CHM.put("a", value);
}
}
}
答案 0 :(得分:0)
简而言之,如果某个段已更新,并且其他某个线程想要读取它,则它将能够读取,但是将获取上次更新的值(而不是当前/正在进行的值)
注意:一个线程始终优先,因为它们不能同时访问同一密钥。您可能会或可能不会看到对象,这取决于首先对该键进行操作的时间。