Java 系统属性的范围

2024-03-30

在Java中我们使用System.setProperty()方法来设置一些系统属性。根据本文 http://blogs.oracle.com/foo/entry/monitored_system_setproperty系统属性的使用有点棘手。

System.setProperty() 可能是一个邪恶的调用。

  • 它是 100% 线程敌对的
  • 它包含超全局变量
  • 当这些变量神秘莫测时,调试起来非常困难 在运行时改变。

我的问题如下。

  1. 系统属性的范围如何?它们是特定于每个虚拟机的,还是具有“超级全局性”,在每个虚拟机实例上共享相同的属性集?我猜是选项1

  2. 是否有任何工具可用于监视运行时更改以检测系统属性的更改。 (只是为了方便发现问题)


系统属性的范围

至少通过阅读 API 规范System.setProperties http://java.sun.com/javase/6/docs/api/java/lang/System.html#setProperties(java.util.Properties)方法,我无法得到系统属性是否由 JVM 的所有实例共享的答案。

为了找到答案,我编写了两个快速程序,通过以下方式设置系统属性System.setProperty,使用相同的键,但不同的值:

class T1 {
  public static void main(String[] s) {
    System.setProperty("dummy.property", "42");

    // Keep printing value of "dummy.property" forever.
    while (true) {
      System.out.println(System.getProperty("dummy.property"));
      try {
        Thread.sleep(500);
      } catch (Exception e) {}
    }
  }
}

class T2 {
  public static void main(String[] s) {
    System.setProperty("dummy.property", "52");

    // Keep printing value of "dummy.property" forever.
    while (true) {
      System.out.println(System.getProperty("dummy.property"));
      try {
        Thread.sleep(500);
      } catch (Exception e) {}
    }
  }
}

(请注意,运行上面的两个程序将使它们进入无限循环!)

事实证明,当使用两个单独的程序运行这两个程序时java在一个 JVM 进程中设置的属性值不会影响另一 JVM 进程的值。

我应该补充一点,这是使用 Sun 的 JRE 1.6.0_12 的结果,并且这种行为至少在 API 规范中没有定义(或者我还没有找到它),行为可能会有所不同。

有没有什么工具可以监控运行时的变化

据我所知。但是,如果确实需要检查系统属性是否发生更改,则可以保留一份Properties一次,并将其与另一次调用进行比较System.getProperties- 毕竟,Properties http://java.sun.com/javase/6/docs/api/java/util/Properties.html是一个子类Hashtable http://java.sun.com/javase/6/docs/api/java/util/Hashtable.html,因此将以类似的方式进行比较。

以下程序演示了检查系统属性是否已更改的方法。可能不是一个优雅的方法,但它似乎完成了它的工作:

import java.util.*;

class CheckChanges {

  private static boolean isDifferent(Properties p1, Properties p2) {
    Set<Map.Entry<Object, Object>> p1EntrySet = p1.entrySet();
    Set<Map.Entry<Object, Object>> p2EntrySet = p2.entrySet();

    // Check that the key/value pairs are the same in the entry sets
    // obtained from the two Properties.
    // If there is an difference, return true.
    for (Map.Entry<Object, Object> e : p1EntrySet) {
      if (!p2EntrySet.contains(e))
        return true;
    }
    for (Map.Entry<Object, Object> e : p2EntrySet) {
      if (!p1EntrySet.contains(e))
        return true;
    }

    return false;
  }

  public static void main(String[] s)
  {
    // System properties prior to modification.
    Properties p = (Properties)System.getProperties().clone();
    // Modification of system properties.
    System.setProperty("dummy.property", "42");
    // See if there was modification. The output is "false"
    System.out.println(isDifferent(p, System.getProperties()));
  }
}

属性不是线程安全的?

Hashtable http://java.sun.com/javase/6/docs/api/java/util/Hashtable.html 是线程安全的,所以我期待着Properties事实上,API 规范也是如此Properties http://java.sun.com/javase/6/docs/api/java/util/Properties.html类证实了这一点:

这个类是线程安全的:多个 线程可以共享一个Properties不需要外部的对象 同步.,序列化形式 http://java.sun.com/javase/6/docs/api/serialized-form.html#java.util.Properties

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

Java 系统属性的范围 的相关文章

随机推荐

  • Scrapy 遭遇 DEBUG:爬行(400)

    我正在尝试使用 Scrapy 抓取页面 https zhuanlan zhihu com wangzhenotes 我运行这个命令 scrapy shell https zhuanlan zhihu com wangzhenotes and
  • python中的{}和[]有什么区别?

    有什么区别columnNames and columnNames 在Python中 我怎样才能迭代每一个 使用 for value in columnNames OR for idx o val o in enumerate columnN
  • 具有多个类约束的 Haskell 类型签名

    我怎样才能有多个类约束 所以如果A is an Eq and B is a Num 我可以说 f Eq a gt a gt b or f Num b gt a gt b 那么 我怎样才能拥有Eq a gt and Num b gt 同时 f
  • 如何自定义jquery滑块范围的颜色?

    使用 jquery 滑块时 我想将所选范围的默认颜色从灰色更改为蓝色 document ready function var slider slider slider range min min 0 max 100 change funct
  • 如何使用Lucene实现拼音搜索?

    我想使用 Lucene 6 1 0 Soundex 或任何适合葡萄牙语的算法来实现语音搜索 我在互联网上发现了许多不完整的示例 教如何实现自定义分词器 分析器 但似乎这些示例上使用的抽象类在 6 1 0 版本中并不相同 谁能指出我在哪里可以
  • 一元运算与赋值融合

    以下代码中的结果值得怀疑 public static void main String args int i 2 i i 2 i System out println i 本来期待着8作为输出 因为 i 2 应该update我 但它的行为并
  • 重写 XMLHttpRequest.open()

    我怎样才能覆盖XMLHttpRequest open 方法然后捕获并改变它的参数 我已经尝试过代理方法 但它不起作用 尽管删除了打开覆盖XMLHttpRequest 被称为 function var proxied window XMLHt
  • 帮助设置 Ruby on Rails 和 MySQL - 提供奖励

    我迫切需要任何慈善红宝石 Rails 专家的帮助 我真的很想学习RoR 但我无处可去 因为每次我到达需要连接数据库的阶段时 都会出现一些问题 这就是我现在要做的事情 Mac OSX 10 6 6 红宝石 1 9 2 导轨 3 0 5 MyS
  • WCF DataService 不支持预检选项请求?

    我想使用基于 ajax 的组件 KendoUI 来读取 修改 WCF DataServices 实现的 OData 端点上的实体 首先 服务实现相当简单 public class MyFooService DataService
  • 如何在 Windows 命令行中用不同的颜色进行回显

    我知道color bf命令设置整个命令行窗口的颜色 但我想以不同的颜色打印一行 我想用不同的颜色打印一行 使用 ANSI 转义序列 Windows 10 之前的 Windows 控制台上不支持 ANSI 颜色 对于 Windows 10 以
  • 如何在 Julia 1.0 中离线安装 julia 包?

    我有自己的 Julia 包 在 Julia 0 6 上运行良好 当我尝试升级到 Julia 1 0 时 我发现在 Julia 1 0 中添加我自己的包更加困难 我不能把它放在 pkg dir 下 在我的情况下 该包只是我本地磁盘上的几个文件
  • 本地 Postgres 应用程序在端口 5432 上运行,但映射到该端口的 Docker Compose 服务运行时没有错误?

    我在 MacOS 上 Postgres 应用程序在默认端口 5432 上运行 I ran docker compose up对于以下docker compose yml version 3 3 services postgresql ima
  • Git 设置最佳实践

    我的任务是为我的办公室设置 Git 我们有几个网站 我刚刚设置了一个网络驱动器供我们将更改推送到其中 我的问题是 在哪里初始化 Git 存储库 每个站点都有新的 dir init 吗 干净的新驱动器中的一个单元 每个单元用于不同的站点 我还
  • 无法运行任何 flutter 命令“flutter 工具无法访问文件或目录”

    每当我运行 flutter 命令时 包括 扑医生 扑干净 颤振通道 任何通道 etc 我收到以下错误 Gregorys MacBook Pro gregory flutter doctor Unhandled exception Excep
  • 最小宽度和最大宽度 css 媒体查询

    当使用宽度为 720px 的 Samsung Galaxy Nexus 时 这行代码不应该加载样式表 mobile large css 吗 但事实并非如此 这是什么原因以及如何解决 我也在用这个 可能你必须定义device width而不是
  • 如何根据单元格条件将列变成行?

    以下是我的数据示例 Omschrijving AMM AM FG G K MOTRED MINI BPM RVM MOTRED STM RMI MOTRED 1 x magneetplug 1 1 1 1 1 1 2 x afwaterin
  • 第一个弹出窗口显示过时的状态

    我发现了一个符合我口味的弹出窗口的奇怪行为 我希望它显示一个视图PopoverItem and number 两者均应从onTapGesture in ForEach 问题是弹出窗口总是显示默认值number第一次点击时 它会按预期工作 错
  • 枚举的编译时查找表

    我有一个枚举列表 其定义如下 enum PinEnum kPinInvalid kPinA0 kPinA1 kPinB0 kPinB1 kPinC0 kPinC1 每个枚举都需要与其他两个值相关联 即端口和引脚号 目前 我通过运行时函数访问
  • 更改背景图像的不透明度

    我有一个带有文本块的 div 元素和一个父 div 我在其中设置了背景图像 现在我想降低背景图像的不透明度 我怎样才能做到这一点 EDIT 我希望通过编辑 html 内容来改变我的博客文章在 blogger com 上的显示方式 html
  • Java 系统属性的范围

    在Java中我们使用System setProperty 方法来设置一些系统属性 根据本文 http blogs oracle com foo entry monitored system setproperty系统属性的使用有点棘手 Sy