Поток Безопасный метод - PullRequest
       5

Поток Безопасный метод

3 голосов
/ 17 февраля 2012

В настоящее время у меня есть программа, реализующая шаблон проектирования Singleton:

public class Singleton {
    private static Singleton s;

    private Singleton(){

    }

    public static Singleton getInstance(){
        if(s == null){
            s = new Singleton();
        } 

        return s;
    }
}

В одном из интервью меня спросили, что для такой программы есть несколько хороших способов сделать поток метода getInstance безопасным. Я знаю, что один из методов - это просто синхронизировать теги перед этим методом, но интервьюер сказал, что есть и другие, более эффективные способы решения проблемы обеспечения безопасности потоков.

Может кто-нибудь предложить какие-нибудь идеи?

Ответы [ 3 ]

1 голос
/ 17 февраля 2012

О, мое слово, не это снова.

Самый лучший способ написать это самое простое:

public class Singleton {
    private static Singleton s = new Singleton();
    // ...
}

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

1 голос
/ 19 апреля 2018

1.Создать переменную экземпляра во время загрузки класса.

Плюсы:

  • Потокобезопасность без синхронизации
  • Простота реализации

Минусы:

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

2. Синхронизация метода getInstance ()

Плюсы:

  • Безопасность потоков гарантирована.
  • Клиентское приложение может передавать параметры
  • Достигнута отложенная инициализация

Минусы:

  • Низкая производительность из-за блокировки накладных расходов.
  • Ненужная синхронизация, которая не требуется после инициализации переменной экземпляра.

3.Используйте синхронизированный блок внутри цикла if и переменную переменной

Плюсы:

  • Безопасность потока гарантируется
  • Клиентское приложение может передавать аргументы
  • Достигнута отложенная инициализация
  • Затраты на синхронизацию минимальны и применяются только для первых нескольких потоков, когда переменная равна нулю.

Минусы:

  • Дополнительно, если условие
1 голос
/ 17 февраля 2012

По крайней мере, три, о которых я могу думать, хотя два из них сводятся к одному и тому же принципу.

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

Первые версии означают наличие внутреннего класса / перечисления, содержащего фактический код, а вторая - создание экземпляра Singleton энергозависимым и использование обычного решения if-synchronize-if.

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