为什么访问规则不适用于非root组?

时间:2015-09-27 07:11:53

标签: java multithreading

在课程interrupt()Thread方法中,我们调用checkAccess,然后调用SecurityManager#checkAccess(Thread)。现在,考虑SecurityManager.checkAccess(Thread)方法的来源:

public void checkAccess(Thread t) {
     if (t == null) {
         throw new NullPointerException("thread can't be null");
     }
     if (t.getThreadGroup() == rootGroup) { //1
         checkPermission(SecurityConstants.MODIFY_THREAD_PERMISSION);
     } else {
         // just return
     }
 }

//1我们进行比较,如果线程属于根组,如果不属于,我们不应用SecurityManager实例提供的访问规则。所以,我写了以下示例:

public static void main (String[] args) throws java.lang.Exception
{
    Thread t = new Thread();
    System.out.println(t.getThreadGroup()); //prints java.lang.ThreadGroup[name=main,maxpri=10]
    System.out.println(t.getThreadGroup().getParent());  //prints java.lang.ThreadGroup[name=system,maxpri=10]
}

Demo

并发现使用Thread的构造函数创建的线程不属于rootGroup。因此,java.policy文件中指定的权限(特别是)将永远不会应用于我们自己创建的线程。

有什么理由吗?我的意思是,将权限应用于唯一的根组?

1 个答案:

答案 0 :(得分:2)

我想,我认为一个线程被允许中断通常是安全的(不是安全问题),等等不是系统线程的线程。

请注意,javadoc说:

  

"如果thread参数是系统线程(属于具有null父级的线程组),则此方法使用RuntimePermission(" modifyThread")权限调用checkPermission。如果thread参数不是系统线程,则此方法只是静默返回。"

     

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