Синхронизированный метод в подклассе потока - PullRequest
2 голосов
/ 24 января 2020

У меня есть класс, который расширяет поток, и в run () которого вызывается другой метод. Я хочу, чтобы этот метод был синхронизирован, возможно ли синхронизировать метод, определенный в подклассе потока?

Ответы [ 3 ]

3 голосов
/ 24 января 2020

synchronized не является частью сигнатуры метода. Это просто сокращение для переноса тела метода в блок, синхронизированный на this или TheEnclosingClass.class.

Это имеет несколько последствий для методов в подклассах:

  • Вы можете синхронизировать переопределенный метод, даже если переопределенный метод не является.
  • Если вы не делаете переопределенный метод синхронизированным, он не «наследует» синхронизированный Несс из переопределенного метода. Вы должны сделать это явно, если вы хотите, чтобы это тоже было синхронизировано.
2 голосов
/ 24 января 2020

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

1 голос
/ 24 января 2020

Краткий ответ: в классе Thread нет ничего особенного, и нет ничего особенного в любом классе, который вы определили как этот extends Thread. Конечно, у класса Thread есть методы, которые делают то, чего не делают другие методы класса, но то же самое можно сказать и о классе String, о классе HashMap или о любом классе, который стоит написать.

Конечно, Thread является частью стандартной библиотеки Java, а ваш класс - нет. Конечно, Thread принадлежит пакету java.lang, который на самом деле является немного более особенным, чем другие пакеты. Но, даже несмотря на все это ...

... Это просто класс.


PS, Другие ответы здесь содержат хороший совет. Прочитайте их!

...