84669 人學習
152542 人學習
20005 人學習
5487 人學習
7821 人學習
359900 人學習
3350 人學習
180660 人學習
48569 人學習
18603 人學習
40936 人學習
1549 人學習
1183 人學習
32909 人學習
学习是最好的投资!
用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方法,可以保證結果的順序和傳入參數的順序一致
雷雷