1、为什么说该集合是线程安全
final transient ReentrantLock lock = new ReentrantLock();
private transient volatile Object[] array;
public boolean add(E e) { final ReentrantLock lock = this.lock; lock.lock(); try { Object[] elements = getArray(); int len = elements.length; Object[] newElements = Arrays.copyOf(elements, len + 1); newElements[len] = e; setArray(newElements); return true; } finally { lock.unlock(); } }
该集合中add,set通过ReentrantLock实现同步,volatile定义的变量在线程间可见的。
2、为什么不适用synchronized
synchronized和ReentrantLock的作用是相同的,但ReentrantLock提供更丰富的特性,比如:定时锁等待,可中断锁,锁投票等,性能更优一些。ReentrantLock提供了可轮询的锁请求,他可以尝试的去取得锁,如果取得成功则继续处理,取得不成功,可以等下次运行的时候处理,所以不容易产生死锁,而synchronized则一旦进入锁请求要么成功,要么一直阻塞,所以更容易产生死锁。
3、CopyOnWriteArraySet是由Object[]实现,当执行add方法时,会重新copy原数组,并在数组的末端添加。
未完待续
来源:oschina
链接:https://my.oschina.net/u/587677/blog/1553546