簡體   English   中英

兩個線程的同步 ArrayList - 寫入和讀取

[英]Synchronized ArrayList for two threads - write and read

我需要解決這個問題。 我有控制台應用程序,我在其中插入一些字符串值。 控制台應用程序仍在運行,用戶可以添加越來越多的條目,每 1 分鍾,應該有另一個線程將打印一些列表統計信息(例如大小等)。 當我將主線程用於用戶的控制台並使用不同的線程來計算此統計數據並將其打印到控制台時(兩者都使用相同的列表)。 使用就足夠了:

List<String> list = Collections.synchronizedList(new ArrayList<>());

或者我還需要用戶 volatile 並訪問同步塊中的列表?

謝謝!

這取決於您要對列表執行的操作。

Collections.synchronizedList(...)簡單地用同步塊包裝每個方法,在自身上同步。 同步在被調用的方法開始執行時開始,在它停止執行時停止。

從概念上講,它的列表是這樣包裝的:

class SynchronizedList<T> implements List<T> {
  private List<T> delegate;

  @Override public int size() {
    synchronized (this) {
      return delegate.size();
    }
  }

  // ...
}

因此,像list.size()list.add(...)list.get(...)這樣的簡單操作不需要任何進一步的同步。

但是,如果您想做更復雜的事情,例如迭代列表,是的,您需要額外的同步:

synchronized (list) {
  for (String s : list) { ... }
}

這是因為一旦對list.iterator()的隱藏調用完成,同步就會停止; 因此,其他線程將能夠在您迭代時修改列表。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM