search
HomeJavajavaTutorialDetailed explanation of how to implement the Hungry Man and Lazy Man patterns in Java singleton mode

What is the singleton mode

Ensure that there is only one instance of a certain class in the program instead of creating multiple instances, which will improve efficiency.

In the single-interest mode, only one getInstance() method is generally provided to obtain the instance object, and the setInstance() method is not provided. The purpose is to avoid instantiating other instance objects.

There are two modes in the singleton mode, one is the hungry man mode and the other is the lazy man mode.

1. Hungry Han Mode

1. The concept of Hungry Han Mode

The Hungry Han Mode means that the class will be instantiated immediately when it is loaded, and will only appear in subsequent uses. An example.

2. Hungry mode code
package thread.example;
//饿汉模式
public class HungrySingle {
//在类加载的时候就实例化了,类加载只有一次,所以值实例化出了一份该实例对象
    private static HungrySingle instance = new HungrySingle();
    public static HungrySingle getInstance() {
        return instance;
    }
}
3. Is multi-threading thread-safe?

It has already been instantiated when the class is loaded, so the instantiation is not involved. The instantiated modification operation is only a read operation. It is thread-safe in multi-threaded situations.

2. Lazy mode

1. The concept of lazy mode

is not instantiated directly when the class is loaded, but is instantiated when the specified instance method is called. , this will ensure that it will not be instantiated when you don’t want to use it. Generally speaking, it is more efficient than the Hungry Man mode.

2. Lazy mode in single-threaded situations
package thread.example;
//单线程的懒汉模式
public class LazySingle {
    private static LazySingle instance = null;
    //只有在调用该方法的时候才实例化
    public static LazySingle getInstance() {
        if(instance == null) {
            instance = new LazySingle();
        }
        return instance;
    }
}
3. Lazy mode in multi-threaded situations

(1) Causes the inconsistency of lazy mode in multi-threaded situations Security reasons

In the case of multi-threading, both threads may get a copy of instance=null. This is because if thread 1 modifies the instance in its own county, it has not had time to modify the instance in the main memory. instance, causing thread 2 to also instantiate an instance object, and it is no longer a singleton mode at this time. The main cause of this problem is that it involves modifying the instance and losing atomicity. In order to ensure atomicity, we thought of locking to achieve thread safety.

(2) Solution code example

Version 1

package thread.example;
//多线程安全下的懒汉模式
    public class LazySingle {
        private LazySingle() {
    }
    private static LazySingle instance = null;
    //只有在调用该方法的时候才实例化
    public static synchronized LazySingle getInstance() {
        if (instance == null) {
            instance = new LazySingle();
        }
        return instance;
    }
}

Although the code in version 1 ensures thread safety, locking will still occur every time the method is called. Regarding the unlocking problem, in order to further optimize it, we can reduce the granularity of the lock to improve efficiency, because after adding a lock, we will no longer be able to achieve high concurrency, but we still want to improve efficiency, so we will optimize it.

Version 2

Double if judgment locking improves efficiency

package thread.example;
 
public class SecurityLazyModle {
    private LazySingle() {
    }
    private static volatile SecurityLazyModle instance = null;//保证内存可见性,防止编译器过度优化(指令重排序)
    public static SecurityLazyModle getInstance() {
        if(instance == null) {
            synchronized (SecurityLazyModle.class) {
                if(instance == null) {
                    instance = new SecurityLazyModle();
                }
            }
        }
        return instance;
    }
}

Explanation of version 2

The first layer of if is to determine whether the current When the instance is created, the second level of synchronized is to enable the threads that enter the current if to compete for the lock. When the thread that gets the lock enters the third level of if, it determines whether it is empty. If it is not empty, it instantiates the object and then releases it. Lock, after the lock is released, the instance is no longer empty, and subsequent threads are blocked at the third layer if. Later, when accessing the getInstance() method, it is found that the instance is no longer empty, so there is no need to preempt it. Lock resources, because competing locks also consume a lot of time. By processing in this way, thread safety is ensured and efficiency is improved.

The purpose of using volatile here is to prevent instruction reordering caused by compiler optimization. Performing a new object is not an atomic operation and can be divided into three steps:

  1. 1. Allocate memory space

  2. 2. Instantiate objects

  3. 3.Assign values ​​to variables

For the above execution, if 1 and 3 are executed first (assuming 2 has not been completed yet), the thread outside the first layer of if will judge that it is not null at this time, and the object will be returned directly at this time. But this object is only half executed, and subsequent use will cause thread safety issues.

Volatile can ensure that these three steps must be executed (regardless of the order, they will eventually be executed) before external threads can execute. At this time, the integrity of the object is guaranteed.

The above is the detailed content of Detailed explanation of how to implement the Hungry Man and Lazy Man patterns in Java singleton mode. For more information, please follow other related articles on the PHP Chinese website!

Statement
This article is reproduced at:亿速云. If there is any infringement, please contact admin@php.cn delete
How does the class loader subsystem in the JVM contribute to platform independence?How does the class loader subsystem in the JVM contribute to platform independence?Apr 23, 2025 am 12:14 AM

The class loader ensures the consistency and compatibility of Java programs on different platforms through unified class file format, dynamic loading, parent delegation model and platform-independent bytecode, and achieves platform independence.

Does the Java compiler produce platform-specific code? Explain.Does the Java compiler produce platform-specific code? Explain.Apr 23, 2025 am 12:09 AM

The code generated by the Java compiler is platform-independent, but the code that is ultimately executed is platform-specific. 1. Java source code is compiled into platform-independent bytecode. 2. The JVM converts bytecode into machine code for a specific platform, ensuring cross-platform operation but performance may be different.

How does the JVM handle multithreading on different operating systems?How does the JVM handle multithreading on different operating systems?Apr 23, 2025 am 12:07 AM

Multithreading is important in modern programming because it can improve program responsiveness and resource utilization and handle complex concurrent tasks. JVM ensures the consistency and efficiency of multithreads on different operating systems through thread mapping, scheduling mechanism and synchronization lock mechanism.

What does 'platform independence' mean in the context of Java?What does 'platform independence' mean in the context of Java?Apr 23, 2025 am 12:05 AM

Java's platform independence means that the code written can run on any platform with JVM installed without modification. 1) Java source code is compiled into bytecode, 2) Bytecode is interpreted and executed by the JVM, 3) The JVM provides memory management and garbage collection functions to ensure that the program runs on different operating systems.

Can Java applications still encounter platform-specific bugs or issues?Can Java applications still encounter platform-specific bugs or issues?Apr 23, 2025 am 12:03 AM

Javaapplicationscanindeedencounterplatform-specificissuesdespitetheJVM'sabstraction.Reasonsinclude:1)Nativecodeandlibraries,2)Operatingsystemdifferences,3)JVMimplementationvariations,and4)Hardwaredependencies.Tomitigatethese,developersshould:1)Conduc

How does cloud computing impact the importance of Java's platform independence?How does cloud computing impact the importance of Java's platform independence?Apr 22, 2025 pm 07:05 PM

Cloud computing significantly improves Java's platform independence. 1) Java code is compiled into bytecode and executed by the JVM on different operating systems to ensure cross-platform operation. 2) Use Docker and Kubernetes to deploy Java applications to improve portability and scalability.

What role has Java's platform independence played in its widespread adoption?What role has Java's platform independence played in its widespread adoption?Apr 22, 2025 pm 06:53 PM

Java'splatformindependenceallowsdeveloperstowritecodeonceandrunitonanydeviceorOSwithaJVM.Thisisachievedthroughcompilingtobytecode,whichtheJVMinterpretsorcompilesatruntime.ThisfeaturehassignificantlyboostedJava'sadoptionduetocross-platformdeployment,s

How do containerization technologies (like Docker) affect the importance of Java's platform independence?How do containerization technologies (like Docker) affect the importance of Java's platform independence?Apr 22, 2025 pm 06:49 PM

Containerization technologies such as Docker enhance rather than replace Java's platform independence. 1) Ensure consistency across environments, 2) Manage dependencies, including specific JVM versions, 3) Simplify the deployment process to make Java applications more adaptable and manageable.

See all articles

Hot AI Tools

Undresser.AI Undress

Undresser.AI Undress

AI-powered app for creating realistic nude photos

AI Clothes Remover

AI Clothes Remover

Online AI tool for removing clothes from photos.

Undress AI Tool

Undress AI Tool

Undress images for free

Clothoff.io

Clothoff.io

AI clothes remover

Video Face Swap

Video Face Swap

Swap faces in any video effortlessly with our completely free AI face swap tool!

Hot Tools

SAP NetWeaver Server Adapter for Eclipse

SAP NetWeaver Server Adapter for Eclipse

Integrate Eclipse with SAP NetWeaver application server.

VSCode Windows 64-bit Download

VSCode Windows 64-bit Download

A free and powerful IDE editor launched by Microsoft

SecLists

SecLists

SecLists is the ultimate security tester's companion. It is a collection of various types of lists that are frequently used during security assessments, all in one place. SecLists helps make security testing more efficient and productive by conveniently providing all the lists a security tester might need. List types include usernames, passwords, URLs, fuzzing payloads, sensitive data patterns, web shells, and more. The tester can simply pull this repository onto a new test machine and he will have access to every type of list he needs.

Notepad++7.3.1

Notepad++7.3.1

Easy-to-use and free code editor

Safe Exam Browser

Safe Exam Browser

Safe Exam Browser is a secure browser environment for taking online exams securely. This software turns any computer into a secure workstation. It controls access to any utility and prevents students from using unauthorized resources.