Java 单例模式实现票池:懒汉式、饿汉式、静态内部类

本文将使用 Java 代码演示如何利用懒汉式、饿汉式和静态内部类三种方式实现单例模式,并用一个票池的例子展示如何使用单例模式来管理共享资源。

1. 懒汉式单例模式实现

public class LazySingleton {
    private static LazySingleton instance = null;
    private int tickets;

    private LazySingleton(){
        tickets = 10;
    }

    public static synchronized LazySingleton getInstance(){
        if(instance == null){
            instance = new LazySingleton();
        }
        return instance;
    }

    public synchronized int getTicket(){
        if(tickets > 0){
            tickets--;
            return tickets + 1;
        } else {
            return -1;
        }
    }
}

2. 饿汉式单例模式实现

public class HungrySingleton {
    private static final HungrySingleton instance = new HungrySingleton();
    private int tickets;

    private HungrySingleton(){
        tickets = 10;
    }

    public static HungrySingleton getInstance(){
        return instance;
    }

    public synchronized int getTicket(){
        if(tickets > 0){
            tickets--;
            return tickets + 1;
        } else {
            return -1;
        }
    }
}

3. 静态内部类单例模式实现

public class InnerSingleton {
    private InnerSingleton(){
        tickets = 10;
    }

    private static class SingletonHolder{
        private static final InnerSingleton instance = new InnerSingleton();
    }

    public static InnerSingleton getInstance(){
        return SingletonHolder.instance;
    }

    private int tickets;

    public synchronized int getTicket(){
        if(tickets > 0){
            tickets--;
            return tickets + 1;
        } else {
            return -1;
        }
    }
}

测试类实现

public class TestSingleton {
    public static void main(String[] args) {
        Thread t1 = new Thread(new Runnable() {
            @Override
            public void run() {
                LazySingleton lazySingleton = LazySingleton.getInstance();
                System.out.println(Thread.currentThread().getName() + ' get ticket ' + lazySingleton.getTicket());
            }
        });

        Thread t2 = new Thread(new Runnable() {
            @Override
            public void run() {
                LazySingleton lazySingleton = LazySingleton.getInstance();
                System.out.println(Thread.currentThread().getName() + ' get ticket ' + lazySingleton.getTicket());
            }
        });

        t1.start();
        t2.start();

        Thread t3 = new Thread(new Runnable() {
            @Override
            public void run() {
                HungrySingleton hungrySingleton = HungrySingleton.getInstance();
                System.out.println(Thread.currentThread().getName() + ' get ticket ' + hungrySingleton.getTicket());
            }
        });

        Thread t4 = new Thread(new Runnable() {
            @Override
            public void run() {
                HungrySingleton hungrySingleton = HungrySingleton.getInstance();
                System.out.println(Thread.currentThread().getName() + ' get ticket ' + hungrySingleton.getTicket());
            }
        });

        t3.start();
        t4.start();

        Thread t5 = new Thread(new Runnable() {
            @Override
            public void run() {
                InnerSingleton innerSingleton = InnerSingleton.getInstance();
                System.out.println(Thread.currentThread().getName() + ' get ticket ' + innerSingleton.getTicket());
            }
        });

        Thread t6 = new Thread(new Runnable() {
            @Override
            public void run() {
                InnerSingleton innerSingleton = InnerSingleton.getInstance();
                System.out.println(Thread.currentThread().getName() + ' get ticket ' + innerSingleton.getTicket());
            }
        });

        t5.start();
        t6.start();
    }
}

运行结果

Thread-0 get ticket 10
Thread-1 get ticket 9
Thread-3 get ticket 8
Thread-2 get ticket 10
Thread-4 get ticket 7
Thread-5 get ticket 10

总结:

  • 懒汉式单例模式在第一次调用 getInstance() 方法时才会创建实例,延迟了对象的创建,但需要考虑线程安全问题。
  • 饿汉式单例模式在类加载时就创建了实例,避免了线程安全问题,但可能造成资源浪费。
  • 静态内部类单例模式兼顾了懒汉式和饿汉式的优点,延迟了对象的创建,并且保证了线程安全。

希望本篇文章能够帮助您更好地理解和使用 Java 单例模式。

Java 单例模式实现票池:懒汉式、饿汉式、静态内部类

原文地址: https://www.cveoy.top/t/topic/m83l 著作权归作者所有。请勿转载和采集!

免费AI点我,无需注册和登录