在线观看不卡亚洲电影_亚洲妓女99综合网_91青青青亚洲娱乐在线观看_日韩无码高清综合久久

鍍金池/ 問答/Java/ java初始化線程安全問題

java初始化線程安全問題

期望:

Map每個key都維護一個單例的LinkedBlockingQueue

問題點:

在初始化時時如何才能保證線程安全,雙重加鎖由于可見性原因不能起作用,求大神指教,能不能在map.get(key)為空時,得到一個線程安全的對象,避免多次初始化造成數(shù)據(jù)的不一致性的問題

事例代碼如下:
Map<String, LinkedBlockingQueue<Map>> DATA_QUEUE = new ConcurrentHashMap<>();
    
    Object synlock = new Object();

    @Test
    public void test1(){

      new Thread(()-> produceData("1","2")).start();
      new Thread(()-> produceData("1","3")).start();
      new Thread(()-> produceData("1","4")).start();
      new Thread(()-> produceData("1","5")).start();
      new Thread(()-> produceData("1","6")).start();
      new Thread(()-> produceData("1","7")).start();
      System.out.println(DATA_QUEUE);


    }

    public void produceData(String key, Object data) {
        LinkedBlockingQueue queue = DATA_QUEUE.get(key);
        if (queue == null) {
                synchronized (synlock){
                    if(queue == null){
                        queue = new LinkedBlockingQueue();
                        System.out.println("init======"+queue.hashCode());
                    }
                }
        }
        try {
            queue.offer(data, 500, TimeUnit.MILLISECONDS);
            DATA_QUEUE.put(key, queue);
        } catch (InterruptedException e) {
            System.out.println("error");
        }
    }
回答
編輯回答
不二心
if (queue == null) {
    synchronized (synlock){
        if(queue == null){
            queue = new LinkedBlockingQueue();
            DATA_QUEUE.put(key, queue);
            System.out.println("init======"+queue.hashCode());
        } else {
            queue = DATA_QUEUE.get(key);
        }
    }
}

我覺著應(yīng)該是這樣,你把DATA_QUEUE.put(key, queue);放在外面的話,加鎖就沒意義了。

2017年5月15日 12:19