2010-06-01 6 views

ответ

5

Предполагая, что сам конструктор является потокобезопасным, это нормально.

Было бы очень необычно для конструктора не быть поточно-безопасной, но возможно ... даже если он звонит автоматически сгенерированный конструктор по умолчанию для Entity, базовый конструктор может не поточно- , Я не говорю, что это, скорее всего, просто возможно :)

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

Только статические инициализаторы (выражения инициализации для статических переменных и static { ... } блоков непосредственно внутри класса) имеют специальное обращение - VM гарантирует, что они выполняются один раз и только один раз, блокируя другие потоки, ожидающие инициализации типа.

+0

Можете ли вы определить, что вы подразумеваете под 'shared data'? Я понимаю, что это будут некоторые статические поля класса Enity! – Akshat

+0

@Akshat: Я имею в виду любые данные, к которым обращаются и изменяются несколькими потоками. –

+0

Хорошо, предположим, что в этом примере, если конструктор инициализирует некоторые конечные не примитивные поля и ничего другого, нужен ли метод 'getInstance()' для обеспечения безопасности потоков? – Akshat

4

Это зависит от деталей конструктора Entity. Если конструктор Entity изменяет общие данные, это не так.

0

Несколько потоков могут вызвать этот метод, и каждый получит уникальный экземпляр «Entity». Таким образом, этот метод «по сути» является потокобезопасным. Но если в конструкторе или в одном из суперконструкторов есть код, который не является потокобезопасным, у вас может возникнуть проблема безопасности.

1

Безопасность потоков - это доступ к общим данным между различными потоками. Код в вашем примере не имеет доступа к общим данным сам по себе, но независимо от того, является ли он потокобезопасным, зависит от того, получает ли конструктор данные, которые могут быть разделены между разными потоками.

С точки зрения параллельного программирования существует множество тонких и сложных проблем. Если вы хотите узнать о безопасности потоков и параллельном программировании на Java, я настоятельно рекомендую книгу Java Concurrency in Practice от Brian Goetz.

2

Это, вероятно, потокобезопасный, но в чем смысл? Если вы просто используете фабричный метод для перенаправления на конструктор по умолчанию, то почему бы не использовать конструктор в первую очередь? Итак, вопрос: чего вы пытаетесь достичь? Имя getInstance() предлагает одноэлемент (по крайней мере, это обычная практика), но у вас явно нет сингла. Если вы хотите синглтон, использовать статический внутренний класс держателя, как это:

public class Singleton { 

     private Singleton() { 
     } 

     public static Singleton getInstance() { 
      return InstanceHolder.INSTANCE; 
     } 

     private static final class InstanceHolder { 

      public static final Singleton INSTANCE = new Singleton(); 

     } 
    } 

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

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