线程1从段n上的ConcurrentHashMap读取,线程2在同一段中更新值。它是否使线程1读取脏?

时间:2017-12-27 18:28:50

标签: java multithreading

我试图找到我的问题的答案,但无法在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);
        }
    }

} 

1 个答案:

答案 0 :(得分:0)

简而言之,如果某个段已更新,并且其他某个线程想要读取它,则它将能够读取,但是将获取上次更新的值(而不是当前/正在进行的值)

注意:一个线程始终优先,因为它们不能同时访问同一密钥。您可能会或可能不会看到对象,这取决于首先对该键进行操作的时间。