synchronizedList 多线程情况下如果一个线程做循环,有可能会抛出异常,如何处理?

synchronizedList 多线程情况下如果一个线程做循环,有可能会抛出异常,如何处理?
搞成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()等方法是直接对其对象上锁的

阅读 3k
3 个回答

没有代码,只能瞎猜,也许你想要的是这个?

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...

没用过这个,不过看源码,synchronizedList默认的上锁对象就是当前定义的对象:

final Object mutex;     // Object on which to synchronize

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

所以正常来说都是线程安全的,不清楚题主具体什么场景会出现异常,或者尝试自定义上锁对象呢,List<String> syncList = Collections.synchronizedCollection(list, mutex),源码构造方法:

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

synchronizedList你没贴出这个类的代码.

撰写回答
你尚未登录,登录后可以
  • 和开发者交流问题的细节
  • 关注并接收问题和回答的更新提醒
  • 参与内容的编辑和改进,让解决方法与时俱进
推荐问题