当前位置: 首页 > 面试题库 >

为什么Java安全管理器既不禁止创建新的Thread()也不启动它呢?

汤念
2023-03-14
问题内容

您是否偶然知道为什么Java Security Manager不禁止创建新线程或启动它们的解释?新的FileWriter在安全管理器下,但是new
Thread()和threadInstance.start()都不是uneder安全管理器,可以调用。

  1. 禁止它有用吗?
  2. 实施起来会很难吗?
  3. 还是创建和启动新线程并不能禁止它?

问题答案:

在Thread构造函数中执行访问检查,以查看调用方是否有权更改将新线程添加到的ThreadGroup。这就是实施安全策略以禁止创建新线程的方式。

(还有另一项关于创建ThreadGroups的检查…检查您是否有权将新组添加到其父组。)

因此,回答您的问题:

为什么Java Security Manager既不禁止创建新的Thread()也不启动它呢?

原因是您的JVM当前的安全策略允许父线程修改其ThreadGroup。您应该能够修改该策略设置以防止这种情况,从而防止创建子线程。

禁止它有用吗?

它是。允许不受信任的代码创建/启动线程是不明智的,因为:1)一旦启动的线程就无法安全地终止,2)创建/启动大量线程会使JVM(甚至是操作系统)陷入困境。

实施起来会很难吗?

从您的角度来看,只需更改策略。



 类似资料:
  • 问题内容: 我知道不可能重新启动使用的Java Thread对象,但是我找不到 为什么 不允许这样做的解释。即使可以保证线程已完成(请参见下面的示例代码)。 我不明白为什么(至少是)方法不能以某种方式将Thread对象的内部状态重置为与刚创建Thread对象时相同的值。 示例代码: 问题答案: 我知道不可能重新启动使用的Java Thread对象,但是我找不到为什么不允许这样做的解释。即使可以保证

  • 问题内容: 关于Java安全性的这篇文章说: 每当要进行危险的操作时,Java库中的代码都会向安全管理器咨询。 那么,这到底是什么意思?说,如果我已经实现了自己的安全管理器并为整个JVM启用了它。现在,java运行时是否针对每个Java调用(例如System.out.println()等)咨询我的securitymanager,还是仅针对诸如System.exit(),文件操作等api调用进行咨询

  • 因此,关于原型范围的bean,我知道spring只是在将其移交给请求的bean之前将其进行生命周期处理。如果忘记了它。而且从逻辑上我可以理解,因为它是原型,它将只被每个请求使用(是的,不是http请求)但是spring容器为什么不保留原型bean的引用来管理完整的生命周期呢?

  • 问题内容: 我想停止redis服务器,并且它一直在运行。我正在使用redis-2.6.7 检查它是否正在运行: 它显示“ … bind:地址已在使用中”,因此它已在运行。 我努力了 它只是挂起,没有任何反应。我中断检查,是的,它仍在运行。 我努力了 我得到“无法打开配置文件’停止’” 我试过了: 仍在运行。 我想要停止它的原因是,当我尝试通过Python设置或获取值时,它只是挂起了。所以我认为我会

  • 我已经在使用Java 8,它是Nashorn javascript引擎。在我的应用程序中,我出于各种目的从Java classess访问javaScript脚本文件。然而,也可以从javaScript代码访问Java类。但由于我的应用程序中的Javascript也可以由第三方编写,所以我想限制它们(JS脚本)访问Java模块。(特别禁止某些Java类) 我不想限制对Java类的所有访问,只是想寻找

  • 今天我实验室的一个敏感操作完全出了问题。一台电子显微镜上的一个致动器越过了它的边界,在一系列事件之后,我损失了1200万美元的设备。我将故障模块中的40K行缩小到以下范围: 我得到的一些输出示例: 因为这里没有任何浮点运算,而且我们都知道有符号整数在Java溢出时表现良好,所以我认为这段代码没有问题。然而,尽管输出表明程序没有达到退出条件,但它却达到了退出条件(既达到了又没有达到?)。为什么? 我