学习是最好的投资!
用synchronized關鍵字
synchronized
給list加上volatile關鍵字
今天剛看過並發程式設計實戰關於可變物件的安全發布與訪問:安全發布:
在靜態初始化函數中初始化一個物件參考;
將物件的參考保存在volatile或AtomicReference上
將物件的參考保存到某個正確建構物件的final型別上
將物件保存在一個鎖的範圍內.
安全存取:
線程封閉
只讀共享
線程安全共享, 該發布對象內部的訪問方式是線程安全的, 就不需要外部同步了
保護物件, 發布可變物件的物件透過限制外界的存取, 指定存取可變物件的介面.
static List<String> arrayList = new ArrayList<>();這樣已經符合了安全發布的第一條那麼就要保證安全訪問了, 由於list肯定不能安全訪問的前三種情況, 那麼只能依靠在發布對象時,限制外界的訪問, 也就是加鎖.
static List<String> arrayList = new ArrayList<>();
可以按照題主的要求實現,不過這種需求的實現很詭異。
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來實現.如果真的想像題主這樣子的話,還不如不用多線程
join
countdownlatch
用執行緒池的invokeAll方法,可以保證結果的順序和傳入參數的順序一致
雷雷
用
synchronized
關鍵字給list加上volatile關鍵字
今天剛看過並發程式設計實戰關於可變物件的安全發布與訪問:
安全發布:
在靜態初始化函數中初始化一個物件參考;
將物件的參考保存在volatile或AtomicReference上
將物件的參考保存到某個正確建構物件的final型別上
將物件保存在一個鎖的範圍內.
安全存取:
線程封閉
只讀共享
線程安全共享, 該發布對象內部的訪問方式是線程安全的, 就不需要外部同步了
保護物件, 發布可變物件的物件透過限制外界的存取, 指定存取可變物件的介面.
static List<String> arrayList = new ArrayList<>();
這樣已經符合了安全發布的第一條那麼就要保證安全訪問了, 由於list肯定不能安全訪問的前三種情況, 那麼只能依靠在發布對象時,限制外界的訪問, 也就是加鎖.
可以按照題主的要求實現,不過這種需求的實現很詭異。
除了這種方式,還可以透過
join
和传入countdownlatch
來實現.如果真的想像題主這樣子的話,還不如不用多線程用執行緒池的invokeAll方法,可以保證結果的順序和傳入參數的順序一致
雷雷