gpt4 book ai didi

java - 为什么 Properties.list 在打印前复制表格?

转载 作者:搜寻专家 更新时间:2023-11-01 02:21:12 25 4
gpt4 key购买 nike

这是 JDK 中 Properties.list 的实现:

public void list(PrintWriter out) {
out.println("-- listing properties --");
Hashtable<String,Object> h = new Hashtable<>();
enumerate(h);
for (Enumeration<String> e = h.keys() ; e.hasMoreElements() ;) {
String key = e.nextElement();
String val = (String)h.get(key);
if (val.length() > 40) {
val = val.substring(0, 37) + "...";
}
out.println(key + "=" + val);
}
}

线条是什么

Hashtable<String,Object> h = new Hashtable<>();
enumerate(h);

为了?难道不能只使用原始表而不是复制并从中读取数据吗?

最佳答案

list()方法不同步。
所以在 Properties 上的任何调用(甚至那些同步的) list() 期间的实例调用可能会破坏对象的状态并导致异常或逻辑中断。

假设我们直接在 Properties 上迭代而不是使用中间 Properties 实例例如它不是线程安全的

假设我们有两个线程:线程 A 调用此 list()调用 remove() 的方法和线程 B在同一个Properties实例。

这段代码在list()方法有多个竞争条件。

为了说明,我们可以使用 list() 方法的这个片段:

   String key = e.nextElement();
String val = (String)h.get(key);
if (val.length() > 40) {

假设线程 A 在这条指令之后暂停:

 String key = e.nextElement();  

线程 B 恢复并调用 instance.remove()将与线程 A 检索到的键关联的对象作为参数

然后当线程 A 恢复时,它转到下一条指令:

 String val = (String)h.get(key);

该值不再存在。

下一条指令引发异常,因为 val 是 null :

    if (val.length() > 40) {

关于java - 为什么 Properties.list 在打印前复制表格?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/41830626/

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