2014-12-10 5 views
-2

Интервьюер задал мне этот вопрос, и я смутился этим.Singleton в многоядерном процессоре

Вопрос: В вашем webapp, где вы реализовали singleton DP, вы размещаете его в четырехъядерном процессоре. Это означает 4 ядра/нити. Когда запрос поступает от пользователя, один поток будет обслуживать, а когда другой запрос попадает на сервер, следующий поток попытается выполнить.

Таким образом, в этом случае, как одноточечные объекты будут совместно использоваться между ядрами/потоками.

Ожидают ли они завершения 1-го? или что-нибудь еще?

+1

Каков ваш ответ? Вы считаете, что это правильно? Если вы этого не сделаете, почему? – BackSlash

+0

Прежде всего, это зависит от того, имеет ли ваш одноэлемент какое-то состояние или он «без гражданства», если он «без гражданства», тогда он потокобезопасен, если не наоборот. – Maksym

+0

Учитывайте, что это потокобезопасность. Но все же один объект на JVM. Но 4 ядра для HTTP Req/Res. Что произойдет, если в один раз в JVM поступило 2 запроса HTTP? – Rajkumar

ответ

1

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

Один из лучших способов сделать это - использовать Инициализацию по требованию, так как он злоупотребляет способами работы JVM при загрузке классов.

public class Something { 
    private Something() {} 

    private static class LazyHolder { 
     private static final Something INSTANCE = new Something(); 
    } 

    public static Something getInstance() { 
     return LazyHolder.INSTANCE; 
    } 
} 

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

public class ASingleton { 

    private static ASingleton instance = null; 
    private static Object mutex = new Object(); 

    private ASingleton() { 
    } 

    public static ASingleton getInstance() { 
     if (instance == null) { 
      synchronized (mutex) { 
       if (instance == null) 
        instance = new ASingleton(); 
      } 
     } 
     return instance; 
    } 
} 
+1

Это баня червей. Существует несколько способов правильной реализации Singleton. Конечным решением Джошуа Блоха является использование перечисления для него (см. Http://www.journaldev.com/1377/java-singleton-design-pattern-best-practices-with-examples) –

+0

@AdriaanKoster благодарит! – MihaiC

1

Шаблон Singleton означает, что существует один экземпляр на JVM. Это означает, что количество потоков или процессоров не имеет значения - в виртуальной машине Java (т. Е. Запущенном процессе) будет только один экземпляр.

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

+0

Я думаю, вы пропустили точку. «Несколько ядер/процессоров» означает, что один JVM может запускать несколько потоков, а несколько потоков могут одновременно обращаться к экземпляру singleton. Что произойдет, если вы не позаботитесь о параллелизме? – BackSlash

+0

точно моя точка @BackSlash, что произойдет, если один jvm с 4 ядрами начнет обслуживать одноэлементный объект. – Rajkumar

+1

@Rajkumar No. У вас все еще отсутствует точка. Представьте себе один экземпляр JVM с классом, скажем, классом 'A'. Класс 'A' содержит метод' main', который генерирует 10 потоков. Все 10 потоков хотят получить доступ к одному объекту «B». Что произойдет, если все 10 потоков будут обращаться к одному экземпляру в одно и то же время? Несколько ядер = я могу запускать несколько потоков одновременно, что ** отличается от нескольких JVM **. Единственный JVM может запускать больше потоков, и если вы не позаботитесь о параллелизме в своем одиночном режиме, он может работать не так, как ожидалось. – BackSlash

1

Синглтоны по определению не являются потокобезопасными. Если singleton должен быть потокобезопасным, вам придется использовать синхронизацию при доступе к нему из разных потоков. Кроме того, существует разница между потоками Java и потоками ОС. Однопоточное приложение Java может извлечь выгоду из многопоточной ОС (например, более высокой производительности), и многопоточное приложение Java может работать на однопоточной ОС (например, путем распределения циклов ЦП на разные потоки в чередовании).

+0

Downvoter, прокомментируйте? –

3

При условии, что объект Singleton является потокобезопасным, на один JVM будет создан только один одноэлементный объект. Кроме того, если одноэлементный объект разделяется несколькими потоками, и каждый поток вызывает конкретный метод, каждый вызов метода будет выполняться независимо от других потоков. Конечно, есть проблема, если метод манипулирует некоторым общим свойством. В этом случае вам необходимо синхронизировать доступ к методу singleton.

0

Ожидают ли они завершения 1-го?

Это зависит от реализации.

Это одноточечно можно назвать только один раз в то время, из-за механизма синхронизации:

public enum Singleton { 
    INSTANCE; 
    public synchronized int method() { return 1; } 
} 

Это одноточечно можно назвать одновременно на столько же нитей, как вы хотите (ограничение ваше аппаратное обеспечение):

public enum Singleton { 
    INSTANCE; 
    public int method() { return 1; } 
} 
1

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

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

+0

Это, по моему мнению, самое близкое к ответу. Попробует имитировать сценарий с помощью инструментов и посмотреть, что произойдет, если это возможно – Rajkumar

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