java - 异步情况下的循环,怎么解决这个问题
PHPz
PHPz 2017-04-18 10:08:52
0
6
488
PHPz
PHPz

学习是最好的投资!

全部回覆(6)
伊谢尔伦

synchronized關鍵字

左手右手慢动作

給list加上volatile關鍵字

阿神

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

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

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

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

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

安全存取:

  1. 線程封閉

  2. 只讀共享

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

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

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

洪涛

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

    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來實現.如果真的想像題主這樣子的話,還不如不用多線程

Peter_Zhu

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

黄舟

雷雷

熱門教學
更多>
最新下載
更多>
網站特效
網站源碼
網站素材
前端模板