阿神2017-04-18 10:10:52
今天剛看過並發程式設計實戰關於可變物件的安全發布與訪問:
安全發布:
在靜態初始化函數中初始化一個物件參考;
將物件的參考保存在volatile或AtomicReference上
將物件的參考保存到某個正確建構物件的final型別上
將物件保存在一個鎖的範圍內.
安全存取:
線程封閉
只讀共享
線程安全共享, 該發布對象內部的訪問方式是線程安全的, 就不需要外部同步了
保護物件, 發布可變物件的物件透過限制外界的存取, 指定存取可變物件的介面.
static List<String> arrayList = new ArrayList<>();
這樣已經符合了安全發布的第一條
那麼就要保證安全訪問了, 由於list肯定不能安全訪問的前三種情況, 那麼只能依靠在發布對象時,限制外界的訪問, 也就是加鎖.
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
來實現.如果真的想像題主這樣子的話,還不如不用多線程