public synchronized void addElement(E obj) { modCount++; ensureCapacityHelper(elementCount + 1); elementData[elementCount++] = obj; }而HashMap的所有操作都没有加synchronized修饰 ,不如他的put源码
public V put(K key, V value) {
if (key == null)
return
putForNullKey(value);
int hash = hash(key.hashCode());
int i = indexFor(hash, table.length);
for(Entry<K,V> e = table[i]; e != null; e = e.next) {
Object k;
if (e.hash == hash &&((k = e.key) == key || key.equals(k))) {
V oldValue = e.value;
e.value = value;
e.recordAccess(this);
return
oldValue; }
}
modCount++;
addEntry(hash, key, value, i);
return null;
}
再看看ArrayList的add方法的源码public boolean add(E e) { ensureCapacity(size + 1); // Increments modCount!! elementData[size++] = e; return true; }再看StringBuffer的append源码,他是有synchronized修饰的
public synchronized StringBuffer append(String str) { super.append(str); return this; }最后是Properties的setProperty方法,他是有synchronized修饰的
public synchronized Object setProperty(String key, String value) { return put(key, value); }由此就可以判断出谁是线程安全的了。
属性列表可以包含另一个属性列表作为其“默认值”; 如果在原始属性列表中找不到属性键,则会搜索此第二个属性列表。
因为Properties从继承Hashtable时,put种putAll方法可应用于Properties对象。 强烈不鼓励使用它们,因为它们允许调用者插入其键或值不是Strings。 应该使用setProperty方法。 如果store或save方法在包含非String键或值的“受损害”Properties对象上调用,则调用将失败。 类似地,如果在包含非String密钥的“受损害”Properties对象上调用propertyNames或list方法的调用将失败。
public class Vector<E> extends AbstractList<E> implements List<E>, RandomAccess, Cloneable, java.io.Serializable {StringBuffer 存取方法都是同步方法 不存在线程不安全情况public synchronized boolean add(E e) { modCount++; ensureCapacityHelper(elementCount + 1); elementData[elementCount++] = e; return true; } public synchronized E set(int index, E element) {}if (index >= elementCount) throw new ArrayIndexOutOfBoundsException(index); E oldValue = elementData(index); elementData[index] = element; return oldValue; }public synchronized E remove(int index) { modCount++; if (index >= elementCount) throw new ArrayIndexOutOfBoundsException(index); E oldValue = elementData(index); int numMoved = elementCount - index - 1; if (numMoved > 0) System.arraycopy(elementData, index+1, elementData, index, numMoved); elementData[--elementCount] = null; // Let gc do its work return oldValue; }
public final class StringBuffer extends AbstractStringBuilder implements java.io.Serializable, CharSequence {StringBuilder 继承自AbstractStringBuilder 实现序列化接口 存取方法未添加同步锁@Override public synchronized StringBuffer append(Object obj) { toStringCache = null; super.append(String.valueOf(obj)); return this; }}@Override public synchronized StringBuffer delete(int start, int end) { toStringCache = null; super.delete(start, end); return this; }
public final class StringBuilder extends AbstractStringBuilder implements java.io.Serializable, CharSequence {@Override public StringBuilder append(Object obj) { return append(String.valueOf(obj)); } @Override public StringBuilder delete(int start, int end) { super.delete(start, end); return this; }}
public synchronized Object setProperty(String key, String value) {
return put(key, value);
}
通过synchronized实现同步。
@Override
public synchronized int length() {
return count;
}
通过synchronized实现同步
@SuppressWarnings("unchecked")
@Override
public synchronized void sort(Comparator<? super E> c) {
final int expectedModCount = modCount;
Arrays.sort((E[]) elementData, 0, elementCount, c);
if (modCount != expectedModCount)
throw new ConcurrentModificationException();
modCount++;
}
同样通过Synchronized关键字实现同步