gpt4 book ai didi

Java线程在没有通知的情况下死亡

转载 作者:行者123 更新时间:2023-12-01 07:21:04 26 4
gpt4 key购买 nike

我正在使用 HashMap 测试并发性(出于学术目的)。我的目标是抛出某种与从多个线程修改映射结构相关的异常。

最终,负责将内容放入我的 HashMap 中的线程莫名其妙地死亡,而没有抛出任何类型的异常......

public class Test {
public static void main(String[] args) {
Thread.UncaughtExceptionHandler h = new Thread.UncaughtExceptionHandler() {
public void uncaughtException(Thread th, Throwable ex) {
System.out.println("Uncaught exception: " + ex);
}
};

Thread a = new Thread(new MyTask("A"));
Thread b = new Thread(new MyTask("B"));
Thread c = new Thread(new MyTask("C"));
Thread d = new Thread(new MyTask("D"));

a.setUncaughtExceptionHandler(h);
b.setUncaughtExceptionHandler(h);
c.setUncaughtExceptionHandler(h);
d.setUncaughtExceptionHandler(h);

a.start();
b.start();
c.start();
d.start();
while (true) {
System.out.println(MyTask.map.size());
}
}
}

public class MyTask implements Runnable {
static AtomicInteger counter = new AtomicInteger(0);
static Map<String, Integer> map = new HashMap<>();
String name;

MyTask(String _name) {
name = _name;
}

@Override
public void run() {
while (true) {
counter.incrementAndGet();

try {
map.put(name + "_" + counter.get(), counter.get());
} catch (RuntimeException e) {
e.printStackTrace();
}

System.out.println(name + "_" + counter.get());
}
}
}

如果您运行此命令,您会注意到线程将在某个时刻停止打印,并且 map 的大小不再改变。如果您切换到 ConcurrentHashMap,一切都会正常(它会永远打印)。

请让我知道如何捕获此类异常/错误!

最佳答案

我认为没有发生异常或错误。引用Javadoc of HashMap :

Note that this implementation is not synchronized. If multiple threads access a hash map concurrently, and at least one of the threads modifies the map structurally, it must be synchronized externally.

您正在多个线程中修改 map ,而不是同步。因此,该行为是未定义的。

确实,我无法重现您所描述的行为:“ map 的大小不再改变”;我发现长时间运行时,值似乎不会改变;但最终它会改变为一个新值,并保持一段时间。

原因是线程中的 Activity 导致的大小变化不会立即提交到主内存。

关于Java线程在没有通知的情况下死亡,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/37799026/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com