한 번에 하나의 스레드만 객체에 접근하도록 허용한다.
synchronized object는 여러 스레드에 의해 동시에 조작될 수 없다.
package java.util;
public class Vector<E> extends AbstractList<E>
    implements List<E>, RandomAccess, Cloneable, java.io.Serializable {
    ...
    public synchronized boolean add(E e) {
        modCount++;
        add(e, elementData, elementCount);
        return true;
    }
		public synchronized int size() {
        return elementCount;
    }
    ...
}
package java.util;
public class Hashtable<K,V>
    extends Dictionary<K,V>
    implements Map<K,V>, Cloneable, java.io.Serializable {
		...
		@SuppressWarnings("unchecked")
    public synchronized V get(Object key) {
        Entry<?,?> tab[] = table;
        int hash = key.hashCode();
        int index = (hash & 0x7FFFFFFF) % tab.length;
        for (Entry<?,?> e = tab[index] ; e != null ; e = e.next) {
            if ((e.hash == hash) && e.key.equals(key)) {
                return (V)e.value;
            }
        }
        return null;
    }
		public synchronized int size() {
        return count;
    }
		...
}
package java.util;
public class Collections {
	...
	public static <T> List<T> synchronizedList(List<T> list) {
      return (list instanceof RandomAccess ?
              new SynchronizedRandomAccessList<>(list) :
              new SynchronizedList<>(list));
  }
	public static <K,V> Map<K,V> synchronizedMap(Map<K,V> m) {
      return new SynchronizedMap<>(m);
  }
	public static <T> Set<T> synchronizedSet(Set<T> s) {
      return new SynchronizedSet<>(s);
  }
	static class SynchronizedList<E>
      extends SynchronizedCollection<E>
      implements List<E> {
      @SuppressWarnings("serial") // Conditionally serializable
      final List<E> list;
      public E get(int index) {
          synchronized (mutex) {return list.get(index);}
      }
      public void add(int index, E element) {
          synchronized (mutex) {list.add(index, element);}
      }
      public E remove(int index) {
          synchronized (mutex) {return list.remove(index);}
      }
      ...
  }
	...
}
List<String> list = Collections.synchronizedList(new ArrayList<String>());
package java.util.concurrent;
public class CopyOnWriteArrayList<E>
    implements List<E>, RandomAccess, Cloneable, java.io.Serializable {
    final transient Object lock = new Object();
    private transient volatile Object[] array;
    public boolean add(E e) {
        synchronized (lock) {
            Object[] es = getArray();
            int len = es.length;
            es = Arrays.copyOf(es, len + 1);
            es[len] = e;
            setArray(es);
            return true;
        }
    }
    public E get(int index) {
        return elementAt(getArray(), index);
    }
	
    ...
}