Vector的方法加了同步锁,但对于复合操作未加锁,是非线程安全的。如经典的put-if-absent。线程的安全性包括线程的可见性、有序性、原子性。
if (!vector.contains(element))
vector.add(element);
}
在contains和add之间有时间间隔,可能导致执行add时,其他线程已经add过,基于错误假设add,导致非线程安全。
vector需对符合操作加锁,如:
public boolean putIfAbsent(E x) {
synchronized(v) {
boolean absent = !contains(x);
if (absent) {
add(x);
}
}
return absent;
}
Vector和ArrayList都是实现了List接口,但Vector非线程安全,而且采用同步锁,强阻塞,影响性能,不推荐使用,应该废弃。
Vector非线程安全
最新推荐文章于 2023-03-20 10:12:45 发布