Ссылка на метод потокобезопасного конструктора в java? - PullRequest
1 голос
/ 09 мая 2020

например, вот класс A, FunciontionInterface f= A::new, затем я вызываю f () в разных потоках, это потокобезопасно?

примечание: это не дублирующий вопрос Ссылки на метод как параметры метода потокобезопасны в Java. Кроме того, я спрашиваю метод-конструктор объектов, а не метод, определенный пользователем.

Ответы [ 2 ]

3 голосов
/ 09 мая 2020

Ссылка на метод - это значение. Мы не можем сказать, является ли он потокобезопасным или нет. Больше, чем мы можем сказать, является ли значение 3.14159 потокобезопасным или нет.

Если вы помещаете ссылку на метод в общую переменную, то безопасность потоков зависит от того, как общая переменная используется. Как и любая другая переменная.

Если вы вызываете (вызываете) ссылку на метод, безопасность потоков зависит от того, как был реализован метод / конструктор. Реализация может быть поточно-ориентированной или нет.

Возможные причины, по которым конструктор не является поточно-ориентированным включает :

  • с использованием общего состояния c переменная без синхронизации
  • публикация this до того, как она будет полностью инициализирована (небезопасная публикация)
  • конструктор, вызывающий метод для некоторого другого объекта, который не является потокобезопасным.

Я спрашиваю метод-конструктор объектов, а не метод, определенный пользователем.

Нет разницы между обычными методами и конструкторами.

Обратите внимание, что оба методы и конструкторы определяются пользователем ... за исключением конструктора без аргументов по умолчанию. (И даже последний не будет поточно-ориентированным, если его конструктор суперклассов не поточно-ориентирован.)

3 голосов
/ 09 мая 2020

Ссылки на методы - это просто синтаксис c сахар. Поточная безопасность ссылок на методы (в данном случае ссылок на конструкторы) сводится к тому, что сам конструктор является поточно-ориентированным. Ситуации, когда конструкторы не являются потокобезопасными, например:

  • изменение static переменной из конструктора без надлежащего механизма синхронизации
  • публикация this ссылка из конструктора перед объектом полностью инициализирован и может быть доступен другим потокам.

Чтобы добавить больше, если вы вызываете конструктор в каком-либо методе (не имеет значения, выполняется ли это с помощью обычного вызова конструктора или ссылки на этот метод конструктор), то созданный объект привязывается к этому потоку (ограничение потока), и если вы не позволяете ссылке на этот объект уйти - тогда созданный объект используется только одним потоком.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...