web 初始 11

在这里插入代码片
好吧,看来我食言了。
昨天学校没课出去浪了一天,晚上还喋了顿烧烤,回来打了会游戏倒头就睡,直接把你们给忘了,在这里给大家赔个不是~~
少点闲的,前天我不是在文末说下次会很有意思么,那不是因为这次的内容有多么多么稀罕,而是因为这个名字取得我到现在没搞懂是为了个啥。
“懒汉模式和饿汉模式”,乍一看好像是跟吃喝玩有关,但它是几种多线程案例,是代码形式,是学习的东西,老传统,还是先挂代码。

在这里插入代码片
class Singleton {
private static Singleton instance = new Singleton();
private Singleton() {}
public static Singleton getInstance() {
return instance;
}
}
//传说中的饿汉模式

class Singleton {
private static Singleton instance = null;
private Singleton() {}
public static Singleton getInstance() {
if (instance == null) {
instance = new Singleton();
}
return instance;
}
}
//传说中的懒汉模式

在这里插入代码片
这里是官方定义:
懒汉模式:在类加载的时候不被初始化。
饿汉模式:在类加载时就完成了初始化,但是加载比较慢,获取对象比较快。
如果仔细观察代码的话,会发现这两个确实长得不太一样,一个是先给instance实例化然后在其同步方法中返回,一个则是先不实例化,设个空值,在其同步方法中判断一下,确定真是空了,才实例化,然后返回,要说效率的话懒汉要高一点,因为在实例化之前就判断该变量是否为空,这样就直接否定了不为空的一切情况,而如果一开始就实例化的话后面还需要分情况判断是否为空,以及空是否会带来影响之类的。(特别注意,上方代码为单线程)
但这跟“饿”跟“懒”有啥关系呢?虽然这种新意的命名方法确实有点意思~~
再回到这个“懒汉模式”,这个在我的教材上还挺重要,分了两个版本,单线程和多线程,在多线程里又分了两个版本,低性能和高性能。
上代码

在这里插入代码片
class Singleton {
private static Singleton instance = null;
private Singleton() {}
public synchronized static Singleton getInstance() {
if (instance == null) {
instance = new Singleton();
}
return instance;
}
}
//低性能版

class Singleton {
private static volatile Singleton instance = null;
private Singleton() {}
public static Singleton getInstance() {
if (instance == null) {
synchronized (Singleton.class) {
if (instance == null) {
instance = new Singleton();
}
}
}
return instance;
}
}

//高性能版

在这里插入代码片
高性能版和低性能版的区别更小,一个是给方法上synchronized锁,一个是给类上synchronized锁 ,一个未经判断直接给该变量的同步方法上锁,之后判断该变量是否为空,再实例化,判断的仅仅是锁后情况,在锁释放后肯定要回溯锁前情况;另一个优势显著,首先方法没上锁,不用担心阻塞,在一次判断为空时才给该类上锁,注意,虽然上锁的是类,但不影响该变量和其同步方法的使用,因为仔细观察你会发现高性能里的变量拥有volatile属性,也就是说这代码顺序是被定死了的,而该变量在锁前被创建,管你上啥锁我该用照样用,接着,锁完了之后再次判断是否为空,锁前锁后情况全部讨论,除去一切非空情况,实例化然后返回。
说实话,在看懂这段码后真的佩服得五体投地,高性能这操作够骚。
但为啥叫懒汉呢~~

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值