<<java并发编程实践>>之复合操作加锁策略

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关键字就能搞定的。

猜你喜欢

转载自cyril0513.iteye.com/blog/1696927