Compreensão do modo criacional-modo singleton

Índice

1. Introdução:

2. Os benefícios dos objetos singleton

3. Como projetar manualmente uma classe de objeto singleton

3.1 Classe singleton chinesa faminta

3.2 Classe singleton preguiçosa

3.3 Classe singleton IoDH

3.4 Com a ajuda da mola


1. Introdução:

Os objetos bean gerenciados pelo Spring por padrão estão todos no modo singleton, a menos que o escopo seja alterado de acordo com a anotação scop;

No modelo singleton, se a variável privada global não for definida, não haverá problema de insegurança do thread no caso de multithreading;

No caso de cada thread, o valor da variável do objeto singleton e a etapa em que o thread é executado são armazenados na pilha e no contador do programa, armazenados na memória, e não há situação insegura do thread;

Se uma variável pública for definida na classe, será necessário um processamento especial, caso contrário, vários threads se referirão conjuntamente a uma variável local e serão projetados problemas de segurança de thread:

Método de processamento 1:

Use variáveis ​​​​de thread local para processamento

Método de processamento 2:

Use a classe atômica Atomic para processamento

2. Os benefícios dos objetos singleton

Para economizar recursos do sistema, às vezes é necessário garantir que uma classe no sistema

Existe apenas uma instância. Quando esta instância única é criada com sucesso, não podemos criar outro objeto do mesmo tipo. Todas as operações só podem ser baseadas nesta instância única. Para garantir a singularidade do objeto, podemos alcançá-lo através do padrão singleton, que é a motivação do padrão singleton

3. Como projetar manualmente uma classe de objeto singleton

3.1 Classe singleton chinesa faminta

Quando o projeto é carregado inicialmente, ele é criado automaticamente

class BeanTest{ 
    private static final BeanTest bean= new BeanTest(); 
    private BeanTest() { } 
 
    public static BeanTest getBean() {
        return bean; 
    }   
}

3.2 Classe singleton preguiçosa

O conceito é semelhante ao carregamento lento, quando esta classe é chamada pela primeira vez, o objeto está sendo criado;

Observe que dois julgamentos são necessários para evitar a criação repetida de objetos em situações multithread;

class LazyBean { 
    private volatile static LazyBean bean= null; 
 
    private LazyBean () { } 
 
    public static LazyBean getBean() { 
        //第一重判断
        if (bean== null) {
            //锁定代码块
            synchronized (LazyBean.class) {
                //第二重判断
                if (bean == null) {
                    bean= new LazyBean (); //创建单例实例
                }
            }
        }
        return bean; 
    }
}

3.3 Classe singleton IoDH

A otimização de mesclagem dos preguiçosos e famintos ocorre principalmente através da criação de uma classe estática interna, o código é o seguinte

class IoDhBean{
	private IoDhBean() {
	}
	
	private static class CreateBean{
            private final static IoDhBean bean= new IoDhBean();
	}
	
	public static Singleton getBean() {
	    return CreateBean.bean;
	}
	
    //demo测试类是否一致
	public static void main(String args[]) {
        IoDhBean bean1 = IoDhBean.getBean();
	    IoDhBean bean2= IoDhBean.getBean();
	    System.out.println(bean1 ==bean2);
        //J结果时true,没有重复创建对象
	}
}

3.4 Com a ajuda da mola

Você pode customizar uma classe, com a ajuda de anotações do Spring, como service, common e outras anotações, deixar essa classe ser gerenciada pelo Spring,

Preste atenção ao processamento de variáveis ​​internas (processamento de acordo com regras de negócio)

Acho que você gosta

Origin blog.csdn.net/qq_44691484/article/details/130569534
Recomendado
Clasificación