/ / Синхронизиране на Java в единичен модел - java, синхронизация, singleton

Java синхронизиране в единичен модел - java, синхронизация, singleton

Трябва ли ключовата дума за синхронизиране да бъде приложена към всеки метод от класа, който изпълнява този тип единичен тон?

public class Singleton {

private Singleton(){}

public synchronized static Singleton getInstance()
{
if(instance == null)
instance = new Singleton ();

return instance;
}

public void DoA(){
}
}

Тъй като Singletons не излагат публикаконструктора и метода getInstance () се синхронизират, не е необходимо да синхронизирате метода DoA и други публични методи, изложени от класа Singleton.

Това разсъждение ли е правилно?

Отговори:

17 за отговор № 1

То е като всеки друг клас. Може или не може да се нуждае от по-нататъшна синхронизация.

Обърнете внимание на следния пример:

public class Singleton {

private Singleton() {}

public synchronized static Singleton getInstance() { ... }

private int counter = 0;

public void addToCounter(int val) {
counter += val;
}
}

Ако класът трябва да се използва от множество нишки, addToCounter() има състезателно състояние. Един от начините да се определи това е чрез вземане addToCounter() синхронизирано:

  public synchronized void addToCounter(int val) {
count += val;
}

Съществуват и други начини за фиксиране на състоянието на състезанието, например чрез използване AtomicInteger:

  private final AtomicInteger counter = new AtomicInteger(0);

public void addToCounter(int val) {
counter.addAndGet(val);
}

Тук ние определихме условията на състезанието без да ги използваме synchronized.


9 за отговор № 2

Е, целта на Singleton класа е, че има най-много един пример за него и че всички Threads имат достъп до същия обект.

Ако няма да синхронизирате getInstance може да се случи следното

Въвежда се Thread1 getInstance()

Въвежда се Thread2 getInstance()

Темата1 се оценява instance == null да се true

Thread2 оценява instance == null да се true

Задава се Thread1 instance и се връща

Thread2 реправоприемници instance = new Singleton() и се връща.

Сега нишките имат различен пример за класа на Singleton, което трябва да бъде предотвратено от този модел.

Синхронизирането не позволява на двете нишки да имат достъп едновременно до същия блок код. Затова синхронизирането е необходимо в многонишкова среда, когато създавате единични класове.

Сега, ако приемем, че ще се опитат множество темиза да получите достъп до методите Singletons едновременно може да е необходима и синхронизация на тези методи. Особено, ако те променят данните, вместо да ги четат, това е вярно.


1 за отговор № 3

Правилният (най-добър) начин за използване на Singleton

private static singleton getInstance() {
if (minstance == null) {
synchronized (singleton.class) {
if (minstance == null) {
minstance = new singleton();
}
}
}
return minstance;
}

1 за отговор № 4

мързелива инициализация и безопасно решение за конци:

public class Singleton {

public static class SingletonHolder {
public static final Singleton HOLDER_INSTANCE = new Singleton();
}

public static Singleton getInstance() {
return SingletonHolder.HOLDER_INSTANCE;
}
}