<<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关键字就能搞定的。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值