哪个 类 可以抛出 ConcurentModificationException?
which classes can throw the ConcurentModificationException?
我刚刚在 Java concurrency in practice 书中找到了 HiddenInterator 示例。
class ConcurentIterator implements Runnable {
// because of final it is immutable, so it is thread safe
private final Set<Integer> v = new HashSet<Integer>();
//private final Vector<Integer> v = new Vector<Integer>();
public synchronized void add(Integer i) {
v.add(i);
}
public synchronized void remove(Integer i) {
v.remove(i);
}
public void addTenThings() {
Random r = new Random();
for (int i = 0; i < 10; i++) {
add(r.nextInt());
System.out.println("DEBUG: added ten elements to " + v);
}
}
public void run() {
addTenThings();
}
}
我都明白了!那很好!
我有以下问题:
在java中,我们有并发集合,例如:ConcurentSkipListMap、ConcurrentHashMap,问题已修复。 但是 我感兴趣的是哪些 类 问题可能发生的地方(未修复的地方)? 例如它可以出现在向量上吗?我在测试的时候,无法在vector中抛出ConcurentModificationException。
检测方法:
public static void main(String[] args) {
Thread[] threadArray = new Thread[200];
ConcurentIterator in = new ConcurentIterator();
for (int i = 0; i < 100; i++) {
threadArray[i] = new Thread(in);
}
for (int i = 0; i < threadArray.length; i++) {
threadArray[i].start();
}
}
线程不安全集合将表现出抛出 ConcurrentModificationException 的这种行为 - 例如 Arraylist、HashSet、HashMap、TreeMap、LinkedList...
如果在不使用正在使用的迭代器的情况下迭代集合时更改集合,则像 vector 这样的线程安全集合也会表现出这种行为。
你的 objective 在这里 - 知道可以抛出此异常的所有集合的名称;最好我们专注于概念并通过个别示例来演示概念。
在下面为使用 Vector 并仍会抛出 ConcurrentModificationException 的代码添加一个示例 - 这个想法是应该通过迭代器完成删除,否则集合将无法发出并发尝试修改集合的信号
public static void main(String[] args) {
Vector<Integer> numbers = new Vector<Integer>(Arrays.asList(new Integer[]{1,2,3,4,5,6}));
for (Integer integer : numbers) {
System.out.println(integer);
numbers.remove(2);
}
}
我刚刚在 Java concurrency in practice 书中找到了 HiddenInterator 示例。
class ConcurentIterator implements Runnable {
// because of final it is immutable, so it is thread safe
private final Set<Integer> v = new HashSet<Integer>();
//private final Vector<Integer> v = new Vector<Integer>();
public synchronized void add(Integer i) {
v.add(i);
}
public synchronized void remove(Integer i) {
v.remove(i);
}
public void addTenThings() {
Random r = new Random();
for (int i = 0; i < 10; i++) {
add(r.nextInt());
System.out.println("DEBUG: added ten elements to " + v);
}
}
public void run() {
addTenThings();
}
}
我都明白了!那很好!
我有以下问题:
在java中,我们有并发集合,例如:ConcurentSkipListMap、ConcurrentHashMap,问题已修复。 但是 我感兴趣的是哪些 类 问题可能发生的地方(未修复的地方)? 例如它可以出现在向量上吗?我在测试的时候,无法在vector中抛出ConcurentModificationException。
检测方法:
public static void main(String[] args) {
Thread[] threadArray = new Thread[200];
ConcurentIterator in = new ConcurentIterator();
for (int i = 0; i < 100; i++) {
threadArray[i] = new Thread(in);
}
for (int i = 0; i < threadArray.length; i++) {
threadArray[i].start();
}
}
线程不安全集合将表现出抛出 ConcurrentModificationException 的这种行为 - 例如 Arraylist、HashSet、HashMap、TreeMap、LinkedList...
如果在不使用正在使用的迭代器的情况下迭代集合时更改集合,则像 vector 这样的线程安全集合也会表现出这种行为。
你的 objective 在这里 - 知道可以抛出此异常的所有集合的名称;最好我们专注于概念并通过个别示例来演示概念。
在下面为使用 Vector 并仍会抛出 ConcurrentModificationException 的代码添加一个示例 - 这个想法是应该通过迭代器完成删除,否则集合将无法发出并发尝试修改集合的信号
public static void main(String[] args) {
Vector<Integer> numbers = new Vector<Integer>(Arrays.asList(new Integer[]{1,2,3,4,5,6}));
for (Integer integer : numbers) {
System.out.println(integer);
numbers.remove(2);
}
}