public int size() { synchronized(mutex) {return c.size();} } public boolean isEmpty() { synchronized(mutex) {return c.isEmpty();} } public boolean contains(Object o) { synchronized(mutex) {return c.contains(o);} }Collections.synchronizedList实际上做的工作也很简单.
public static <T> List<T> synchronizedList(List<T> list)返回由指定列表支持的同步(线程安全的)列表。为了保证按顺序访问,必须通过返回的列表完成对底层列表的所有访问。 在返回的列表上进行迭代时,强制用户手工在返回的列表上进行同步: List list = Collections.synchronizedList(new ArrayList()); ... synchronized(list) { Iterator i = list.iterator(); // Must be in synchronized block while (i.hasNext()) foo(i.next()); } 不遵从此建议将导致无法确定的行为。 如果指定列表是可序列化的,则返回的列表也将是可序列化的。 参数: list - 被“包装”在同步列表中的列表。 返回: 指定列表的同步视图。还要自己去实现同步的
List list = Collections.synchronizedList(new ArrayList());
arraylist不是fanl类,可以继承。
List list = Collections.synchronizedList(new ArrayList());
Vector是线程安全的,重量级的
其实区别就是一个有Sychronized 一个没有
List list = Collections.synchronizedList(new ArrayList());
正解! 面试官就是考你Collections工具类中这一静态方法
还可以用Collections的synchronizedList(List<T> list) 方法来获取该list的同步安全list。
还可以把list内的元素用同步安全的思想来实现,总之不管怎么样,只要实现了同步安全就行了
纠结了半天,才想起来。
如果让我去,估计 over 了
public int size() {
synchronized(mutex) {return c.size();}
}
public boolean isEmpty() {
synchronized(mutex) {return c.isEmpty();}
}
public boolean contains(Object o) {
synchronized(mutex) {return c.contains(o);}
}Collections.synchronizedList实际上做的工作也很简单.
在返回的列表上进行迭代时,强制用户手工在返回的列表上进行同步: List list = Collections.synchronizedList(new ArrayList());
...
synchronized(list) {
Iterator i = list.iterator(); // Must be in synchronized block
while (i.hasNext())
foo(i.next());
}
不遵从此建议将导致无法确定的行为。
如果指定列表是可序列化的,则返回的列表也将是可序列化的。
参数:
list - 被“包装”在同步列表中的列表。
返回:
指定列表的同步视图。还要自己去实现同步的
arraylist不是fanl类,可以继承。