Índice
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
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)