解决多线程已经资源浪费的单例模式代码

GG单例模式的第一个版本,采用的是“饿汉式”,也就是当类加载进来的就立即实例化GG对象,但是这种方式比较的消耗计算机资源。具体实现代码如下:

package com.diermeng.designPattern.Singleton;

/*

 * GG单例模式的第一个版本 为“饿汉式”

 */

public class GGVersionOne {

    //在类被加载进入内存的时候就创建单一的GG对象

    public static final GGVersionOne gGVersionOne = new GGVersionOne();

    //名称属性

    private String name;

 

 

    public String getName() {

        return name;

    }

 

    public void setName(String name) {

        this.name = name;

    }

 

    //构造函数私有化

    private GGVersionOne() {

    }

 

    //提供一个全局的静态方法

    public static GGVersionOne getGG() {

        return gGVersionOne;

    }

}

GG单例模式的第二个版本:“懒汉式”,在单线程下能够非常好的工作,但是在多线程下存在线程安全问题,具体代码如下:

package com.diermeng.designPattern.Singleton;

/*

 * GG单例模式的第二个版本 采用“懒汉式” 在需要使用的时候才实例化GG

 */

public class GGVersionTwo {

    //GG的姓名

    private String name;

    //对单例本身引用的名称

    private static GGVersionTwo gGVersionTwo;

 

    public String getName() {

        return name;

    }

 

    public void setName(String name) {

        this.name = name;

    }

 

    //构造函数私有化

    private GGVersionTwo() {

    }

 

    //提供一个全局的静态方法

    public static GGVersionTwo getGG() {

        if(gGVersionTwo == null) {

            gGVersionTwo = new GGVersionTwo();

        }

        return gGVersionTwo;

    }

}

GG单例模式的第三个版本,为解决多线程问题,采用了对函数进行同步的方式,但是比较浪费资源,因为每次都要进行同步检查,而实际中真正需要检查只是第一次实例化的时候,具体代码如下所示:

package com.diermeng.designPattern.Singleton;

/*

 * GG单例模式的第三个版本 对函数进行同步

 */

public class GGVersionThree {

    //GG的姓名

    private String name;

    //对单例本身引用的名称

    private static GGVersionThree gGVersionThree;

 

    public String getName() {

        return name;

    }

 

    public void setName(String name) {

        this.name = name;

    }

 

    //构造函数私有化

    private GGVersionThree() {

    }

 

    //提供一个全局的静态方法,使用同步方法

    public static synchronized GGVersionThree getGG() {

        if(gGVersionThree == null) {

            gGVersionThree = new GGVersionThree();

        }

        return gGVersionThree;

    }

}

GG单例模式第四个版本,既解决了“懒汉式的”多线程问题,又解决了资源浪费的现象,看上去是一种不错的选择,具体代码如下所示:

package com.diermeng.designPattern.Singleton;

/*

 * GG单例模式的第四个版本,既解决了“懒汉式的”多线程问题,又解决了资源浪费的现象,看上去是一种不错的选择

 */

public class GGVersionFour {

    //GG的姓名

    private String name;

    //对单例本身引用的名称

    private static GGVersionFour gGVersionFour;

 

    public String getName() {

        return name;

    }

 

    public void setName(String name) {

        this.name = name;

    }

 

    //构造函数私有化

    private GGVersionFour() {

    }

 

    //提供一个全局的静态方法

    public static GGVersionFour getGG() {

        if(gGVersionFour == null) {

            synchronized (GGVersionFour.class) {

                if(gGVersionFour == null) {

                    gGVersionFour = new GGVersionFour();

                }

            }

 

        }

        return gGVersionFour;

    }

}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值