public class UnSafeOperation { //直接使用this加锁 public synchronized String get(Vector<String> vector) { if (vector.isEmpty()) { return null; } int index = vector.size() - 1; return vector.get(index); } //对vector加锁 public String get1(Vector<String> vector) { synchronized (vector) { if (vector.isEmpty()) { return null; } int index = vector.size() - 1; return vector.get(index); } } public synchronized void delete(Vector<String> vector) { int index = vector.size() - 1; vector.remove(index); } public synchronized void delete1(Vector<String> vector) { synchronized (vector) { int index = vector.size() - 1; vector.remove(index); } } public static void main(String[] args) { final Vector<String> vector = new Vector<String>(); vector.add("chneliang"); final UnSafeOperation unSafe = new UnSafeOperation(); new Thread() { public void run() { unSafe.get(vector); } }.start(); unSafe.delete(vector); } }
实现对Vector的修改,如果不使用加锁控制,这样的复合操作,会导致发生错误。但是如果加锁,是直接像get()方法这样,还是对修改的对象加锁,其实很明显,如果我们直接对this加锁,会导致该类中的其他同步方法受到阻塞,锁的粒度太大,如果我们仅仅只是对要修改的对象加锁,就不会有这样的问题。
初次学习并发,发现涉及锁的策略,也并不是那么简单的直接用一个synchronized关键字就能搞定的。