Страницы

Поиск по вопросам

четверг, 4 октября 2018 г.

Как ведет себя static метод в многопоточном приложении?

Например тут: public class Singleton{
private static Cat cat = new Cat();
public static Cat getInstance(){
return cat; } } Почему такой вариант хуже (если хуже), чем использование не статического метода getInstance()? P.S. Цель вопроса выяснить, есть ли разница между использованием статического метода getInstance() и не статического, в ситуации когда к нему могут обращаться много потоков одновременно.


Ответ

Приведённый вариант лучше, чем вариант с нестатическим getInstance потому, что иначе никак. Если метод нестатический, то придётся создавать класс Singleton каждый раз. Кроме того, очевидно, что вы неправильно реализовали синглтон. Получается, что вы можете получать экземпляр класса Cat через Singleton, а можете просто создавать через new Cat сколько угодно, что будет неверно и вы никак не сможете от этого защититься. Поэтому надо делать public class Cat {
private static final Cat cat = new Cat();
public static Cat getInstance(){ return cat; } } С точки зрения многопоточности нет разницы между статическим и нестатическим методом, если он не помечен как synchronized. Приведённый выше вариант, как уже говорилось, имеет недостаток: создание экземпляра при подгрузке класса (часто при старте приложения). Чтобы избежать этой проблемы, можно использовать паттерн Initialization on Demand Holder idiom. public class Cat{ private Cat() { }
private static class LazyHolder { private static final Cat INSTANCE = new Cat(); }
public static final Cat getInstance() { return LazyHolder.INSTANCE; } } При таком раскладе достигается эффективная потокобезопасность и получена ленивая инициализация (lazy-load singleton). Однако, в большинстве случаев нет необходимости делать такую сложную конструкцию, а достаточно реализовать первым способом.

Комментариев нет:

Отправить комментарий