鍍金池/ 問答/Java  Linux/ synchronizedList 多線程情況下如果一個線程做循環(huán),有可能會拋出異

synchronizedList 多線程情況下如果一個線程做循環(huán),有可能會拋出異常,如何處理?

synchronizedList 多線程情況下如果一個線程做循環(huán),有可能會拋出異常,如何處理?
搞成CopyOnwriteArrayList 性能太差了

synchronizedList里的上鎖對象是mutex,如下:

static class SynchronizedCollection<E> implements Collection<E>, Serializable {
    。。。
    final Object mutex;     // Object on which to synchronize
    。。。
    }
 

如果對synchronizedList對象上鎖,和在mutex上上鎖的add()不會互斥啊
這種情況是不是用Vector比較好?Vector的add()等方法是直接對其對象上鎖的

回答
編輯回答
柚稚

synchronizedList你沒貼出這個類的代碼.

2017年2月10日 04:56
編輯回答
陌上花

沒有代碼,只能瞎猜,也許你想要的是這個?

List list = Collections.synchronizedList(new ArrayList());
    ...
synchronized (list) {
    Iterator i = list.iterator(); // Must be in synchronized block
    while (i.hasNext())
        foo(i.next());
}

參見:
https://stackoverflow.com/a/1...

2018年7月13日 08:22
編輯回答
護她命

沒用過這個,不過看源碼,synchronizedList默認的上鎖對象就是當(dāng)前定義的對象:

final Object mutex;     // Object on which to synchronize

SynchronizedCollection(Collection<E> c) {
    this.c = Objects.requireNonNull(c);
    mutex = this;
}

所以正常來說都是線程安全的,不清楚題主具體什么場景會出現(xiàn)異常,或者嘗試自定義上鎖對象呢,List<String> syncList = Collections.synchronizedCollection(list, mutex),源碼構(gòu)造方法:

SynchronizedCollection(Collection<E> c, Object mutex) {
    this.c = Objects.requireNonNull(c);
    this.mutex = Objects.requireNonNull(mutex);
}
2017年11月27日 01:06