【问题标题】:How to allow the thread to modify itself only如何让线程只修改自己
【发布时间】:2015-09-27 04:57:31
【问题描述】:

interrupt() 方法的文档中,我们有:

Throws:
    SecurityException - if the current thread cannot modify this thread

方法的source code是这样的:

public void interrupt() {
     if (this != Thread.currentThread())
         checkAccess();   //checking access
     //The rest is ommited
 }

checkAccess方法,依次实现如下:

public final void checkAccess() {
    SecurityManager security = System.getSecurityManager();
    if (security != null) {
        security.checkAccess(this);
    }
}

默认情况下,据我所知,任何线程都允许修改其他任何线程。

但是有没有办法在java.policy 文件中指定modifyThread 权限以允许线程只修改自己?

java.policy 中,我可以找到唯一的grant{ ... } 部分。有没有办法拒绝这样的线程通信?

【问题讨论】:

  • 如何修改自身?唯一相关的操作是interrupt(), setName(),setPriority()。这是您担心的其中之一吗?如果是,为什么?
  • @VenkataRaju 他知道,他在询问细粒度权限(不存在)。
  • @EJP 我已经知道了。

标签: java multithreading


【解决方案1】:

为了让您使用policy files 来控制谁可以调用Thread.interrupt(),需要有一个policy 来规范这种访问。如您所见,Thread.interrupt() 中没有 SecurityManager.checkPermission() 调用,因此这显然是不可能的。这是设计使然,因为策略旨在限制对代码源的访问,而不是线程(可以从多个源位置执行代码)。如果代码源没有被授予访问某个策略的权限,则它永远无法运行受该策略保护的代码。

相反,Thread 访问受 SecurityManager.checkAccess(Thread) 方法控制。来自Thread.checkAccess()

判断当前运行的线程是否有权限修改这个线程。

如果有一个安全管理器,它的checkAccess 方法会以这个线程作为它的参数被调用。

SecurityManager.checkAccess(Thread) 准确描述了如何限制访问:

如果不允许调用线程修改线程参数,则抛出SecurityException

此方法由 Thread 类的 stopsuspendresumesetPrioritysetNamesetDaemon 方法为当前安全管理器调用。 [原文如此。这也应该包括interrupt]

....如果线程参数不是系统线程,这个方法只是静默返回。

需要更严格策略的应用程序应覆盖此方法....

所以你去。定义一个自定义SecurityManager,在checkAccess(Thread) 中引发异常,以限制谁可以中断或以其他方式修改线程..


关于授予与拒绝权限的第二个问题,Policy File Syntax 页面详细说明只有 grant 语句,there is no deny mechanism

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2013-11-25
    • 1970-01-01
    • 2015-10-17
    • 1970-01-01
    • 2015-02-24
    • 2015-04-10
    • 1970-01-01
    相关资源
    最近更新 更多