Является ли поток статического внутреннего класса безопасным внутри другого Java-класса? - PullRequest
7 голосов
/ 24 июня 2011

Для коллекции вспомогательных классов меньшего размера я создал общий class MyUtils:

// MyUtils.java
public final class MyUtils
{
  public static class Helper1 {};
  public static class Helper2 {};
//...
}

Этот вспомогательный класс изнутри MyUtils будет использоваться в других файлах пакета:

// MyClass1.java
public class MyClass1
{
  private MyUtils.Helper1 help1 = new MyUtils.Helper1();
  public void method ()
  {
    private MyUtils.Helper2 help2 = new MyUtils.Helper2();
  }
}

Чтобы сделать их доступными, я сделал их static внутри MyUtils (который не имеет ни одного собственного элемента данных / функций). Мой код является потокобезопасным до создания MyUtils.

Меня беспокоит то, что, сделав эти inner классы static, они останутся поточно-безопасными , когда их несколько экземпляров будут существовать в файлах? Или их какое-то плохое значение я пропустил из-за того, что заставил их static?

Редактировать : Я не касаюсь ни одной общей переменной внутри классов helper. Единственное, что меня беспокоило, это то, что экземпляр классов static будет потокобезопасным (поскольку они static).

Ответы [ 5 ]

18 голосов
/ 24 июня 2011

Если вы спрашиваете, является ли это плохим следствием перехода от:

public class Helper1 {}

... чтобы:

public class MyUtils {
    public static class Helper1 {}
}

Тогда нет, нет. Ключевое слово static в этом случае просто «продвигает» вложенный внутренний класс в класс верхнего уровня, так что вы можете создать его экземпляр без необходимости включения экземпляра MyUtils. Вот сносная статья на эту тему:

http://www.javaworld.com/javaworld/javaqa/1999-08/01-qa-static2.html

По сути, выполнение public static class X для вложенного внутреннего класса аналогично выполнению public class X в стандартном классе верхнего уровня.

6 голосов
/ 24 июня 2011

Нет никакого смысла в том, что сам "класс" является поточно-ориентированным или не поточно-ориентированным. Поэтому, независимо от того, является ли это статическим, не имеет значения.

Когда кто-то ссылается на то, что класс является поточно-ориентированным или не поточно-ориентированным, он действительно означает, что функции, предоставляемые этим классом, являются поточно-ориентированными или нет. Соответственно, именно то, что делают внутренние классы, на самом деле имеет значение.

Нет ничего присущего методам, которые делают их небезопасными для повторного входа. Проблемы возникают, когда вы начинаете обращаться к общим переменным и т. Д. Так, например, член класса, к которому обращаются методы, должен быть соответствующим образом синхронизирован. Но если методы не сохраняют состояния и т. Д., То ничто не мешает вам использовать их в нескольких потоках.

Надеюсь, это поможет.

0 голосов
/ 24 июня 2011

Я получил ответ.Создание MyUtils и interface является более чистым дизайном, так как я могу обойтись без static идентификатора из helper классов

0 голосов
/ 24 июня 2011

статические методы и внутренние классы не имеют никакого доступа к переменным их динамического счетчика и, следовательно, не могут использовать мониторы / синхронизировать на экземпляре своего родительского класса.Конечно, это не означает, что их объявление и использование по своей сути не является потокобезопасным.Просто если вам нужно синхронизировать какой-либо из этих статических методов в экземпляре родительского класса, вам нужно быть уверенным, что вы синхронизируете / блокируете до того, как введет их, иначе вы должны явно передать ссылку народительский экземпляр в них.

0 голосов
/ 24 июня 2011

Вам нужно будет защитить доступ к help1, так как это переменная уровня общего доступа.* * * * * * * * * * * * * * * * * * *

* * * * * * * * * * * * * * *

* * * * * * * * * * *1004* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * - 100%. В статических классах и экземплярах, созданных из него, нет ничего особенного.Те же самые правила безопасности потока применяются к экземплярам статических классов, которые также применяются к обычным случаям.

...