设计模式1.单列模式

本文介绍了Java中的两种单例模式实现:饿汉式和懒汉式。饿汉式在类加载时即创建单例,确保线程安全;懒汉式则在首次使用时创建单例,提高了资源利用率。通过代码示例展示了两种方式的实现,并通过一个线程安全的懒汉式应用案例,展示了单例模式在多线程环境下的应用。
摘要由CSDN通过智能技术生成

1.简介

首先,下面我将要讲解的是单列模式的饿汉式和懒汉式的两种,饿汉式呢说的就是在使用对象方法之前呢就先创建了单列,懒汉式呢指的就是在使用方法的时候再创建对象。

2.单例模式(饿汉式)

首先,我们需要做的东西就是在一个类当中创建这样的一个实例。

private static Singleton singleton=new Singleton;

接下来就是在这样的一个类当中对这个单列进行一个输出,那么怎么输出呢,首先根据格式需要,我们可以先自定义一个方法

private Singleton(){
}
public static Singleton single(){
return singleton;
}

完整的代码如下:

package page1;

public class Solution {
    private static Solution solution=new Solution();
    private  Solution(){

    }
    private  static  Solution getInstance(){
        return solution;
    }
    public static void main(String[] args) {
        System.out.println(Solution.getInstance());
    }
}

接下来我们输出的就是这个单例对应的位置。

3.单例模式(懒汉式)

首先,在这里需要注意的就是,懒汉式呢就是在你需要使用方法的时候呢再创建这样的一个单列
首先前面的部分和饿汉式是一样的,你需要做的就是加锁,也就是在private之前加上这个synchronized进行一个锁住就行了,如果不加锁的话,一个线程还好,但是一旦线程变多了,那么将会出现多个线程可以同时调用一个方法,这样就会造成不安全,或者说是违背了单例原则。

 synchronized private static Solution getInstance(){
        if(solution==null){
            solution=new Solution();
            return solution;
        }
        return  solution;
    }

接下来其它部分就和上面的饿汉式是一样的

package page1;

public class Solution {
    private static Solution solution=null;
    private  Solution(){

    }
      synchronized private static Solution getInstance(){
        if(solution==null){
            solution=new Solution();
            return solution;
        }
        return  solution;
    }
    public static void main(String[] args) {
        System.out.println(Solution.getInstance());
    }
}

4.单例模式的应用

package page1;

public class SingleDemo {
    public static void main(String[] args) {

        NumThread threadA = new NumThread("线程A");
        NumThread threadB = new NumThread("线程B");
        threadA.start();
        threadB.start();
    }
}
    class NumThread extends Thread {
        private String threadName;

        public NumThread(String name) {
            threadName = name;
        }          // 重写线程的run方法(线程任务)

        public void run() {
            GlobalNum gnObj = GlobalNum.getInstance();
            // 循环访问,输出访问次数
            for (int i = 0; i < 5; i++) {
                System.out.println(threadName + "第" + gnObj.getNum() + "次访问!");

                try {
                    this.sleep(1000);
                } catch (Exception e) {
                    e.printStackTrace();
                }
            }
        }
    }

运行结果:

线程B1次访问!
线程A2次访问!
线程A4次访问!
线程B3次访问!
线程A5次访问!
线程B6次访问!
线程A7次访问!
线程B8次访问!
线程A9次访问!
线程B10次访问!

Process finished with exit code 0
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值