搜尋

首頁  >  問答  >  主體

java - 异步情况下的循环,怎么解决这个问题

PHPzPHPz2768 天前495

全部回覆(6)我來回復

  • 伊谢尔伦

    伊谢尔伦2017-04-18 10:10:52

    synchronized關鍵字

    回覆
    0
  • ringa_lee

    ringa_lee2017-04-18 10:10:52

    給list加上volatile關鍵字

    回覆
    0
  • 阿神

    阿神2017-04-18 10:10:52

    今天剛看過並發程式設計實戰關於可變物件的安全發布與訪問:
    安全發布:

    1. 在靜態初始化函數中初始化一個物件參考;

    2. 將物件的參考保存在volatile或AtomicReference上

    3. 將物件的參考保存到某個正確建構物件的final型別上

    4. 將物件保存在一個鎖的範圍內.

    安全存取:

    1. 線程封閉

    2. 只讀共享

    3. 線程安全共享, 該發布對象內部的訪問方式是線程安全的, 就不需要外部同步了

    4. 保護物件, 發布可變物件的物件透過限制外界的存取, 指定存取可變物件的介面.

    static List<String> arrayList = new ArrayList<>();這樣已經符合了安全發布的第一條
    那麼就要保證安全訪問了, 由於list肯定不能安全訪問的前三種情況, 那麼只能依靠在發布對象時,限制外界的訪問, 也就是加鎖.

    回覆
    0
  • PHP中文网

    PHP中文网2017-04-18 10:10:52

    可以按照題主的要求實現,不過這種需求的實現很詭異。

        private static void test1(final int i) {
        new Thread(new Runnable() {
            @Override
            public void run() {
                synchronized (arrayList) {
                    while (arrayList.size() != i) {
                        try {
                            arrayList.wait();
                        } catch (InterruptedException e) {
                            // TODO Auto-generated catch block
                            e.printStackTrace();
                        }
                    }
                    arrayList.add(i, i + "position");
                    arrayList.notifyAll();
                }
            }
        }).start();
    }
    

    除了這種方式,還可以透過join和传入countdownlatch來實現.如果真的想像題主這樣子的話,還不如不用多線程

    回覆
    0
  • 天蓬老师

    天蓬老师2017-04-18 10:10:52

    用執行緒池的invokeAll方法,可以保證結果的順序和傳入參數的順序一致

    回覆
    0
  • 黄舟

    黄舟2017-04-18 10:10:52

    雷雷

    回覆
    0
  • 取消回覆