客户端加锁,注意要使用同一个锁

客户端加锁,注意要使用同一个锁。
错误做法:
class ListHelper<E> {
public List<E> list = Collections.synchronizedList(new ArrayList<E>());
public synchronized boolean putIfAbsent(E x) {
boolean absent = !list.contains(x);
if(absent) {
list.add(x);
}
return absent;
}
}
因为这个锁是加上ListHelper上的,ListHelper辅助类,其他对list的操作使用了不同的锁,所以putIfAbsent对其他操作来说并不是原子的。
正确做法:
class ListHelper<E> {
public List<E> list = Collections.synchronizedList(new ArrayList<E>());
public boolean putIfAbsent(E x) {
synchronized(list) {
boolean absent = !list.contains(x);
if(absent) {
list.add(x);
}
return absent;
}
}
}

更好的方法是使用 组合为现有的类添加原子操作:
class ImprovedList<E> implements List<E> {
	private final List<E> list;
	
	public ImprovedList(List<E> list) {
		this.list = list;
	}
	
	public synchronized  boolean putIfAbsent(E x) {
			boolean absent = !list.contains(x);
			if(absent) {
				list.add(x);
			}
			return absent;
	}
客户端不再直接使用这个对象,而结合能通过ImprovedList来说它。

评论 3
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值