2015-09-27 13 views
0

В способекласса Thread у нас есть checkAccess, который в свою очередь вызывает SecurityManager#checkAccess(Thread). Теперь рассмотрим источники метода SecurityManager.checkAccess(Thread):Почему правила доступа не применяются к группе без полномочий root?

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 «s конструкторов не принадлежат к rootGroup. Таким образом, разрешения, указанные в файле java.policy (в частности), никогда не будут применяться нитями, которые мы создаем сами.

Есть ли причина для этого? Я имею в виду, чтобы применить разрешения к единственной корневой группе?

+0

Что бы обоснование блокировки потоков взаимодействия («изменить») между нитями приложения? Потоковое Java-приложение не является ареной «основных войн», где программисты соперничают за наиболее надежную нить. - Что находится внизу этого и еще одного подобного вопроса? – laune

+0

@laune Не знаю, очевидно. Но я использую 'interrupt()' в моем приложении, которое выдает «SecurityException». Поэтому мне нужно знать, как и при каких обстоятельствах это происходит. –

+0

Интересно. Какую тему вы нажимаете? – laune

ответ

2

Я полагаю, что мышление состоит в том, что он, как правило, безопасен (а не проблема безопасности) для потока, которому разрешено прерывать, и т. Д. Потоки, которые не являются системными потоками.

Обратите внимание, что Javadoc говорит, что это:

«Если нить аргумент является системный поток (принадлежит к группе потоков с нулевым родителем), то этот метод вызывает checkPermission с RuntimePermission (» modifyThread»). Если аргумент потока не является системным потоком, этот метод просто возвращается молча ".

«Приложения, которые хотят более строгая политика должна переопределить этот метод. .....»

+0

Спасибо за ответ, он объясняет все. Но какие JavaDocs вы цитировали? –

+0

javadoc для метода 'SecurityManager.checkAccess (Thread t)'. (Вы даже смотрели?) –

+0

Нет, не думал, что это было оттуда. Я искал их в документах Thread –

Смежные вопросы