mysql数据库面试问题,设计模式,看完直呼内行

有心人发现,为什么要将创建单例的代码变量声明为static静态的方法,这就是高明之处,也是重点了,因为类的加载机制,大家都明白变量里面有静态变量和成员变量的,而静态变量它的大哥是类(Class),类创建它就创建,类销毁它就销毁,而成员变量的大哥是对象,也就是那个所谓的实例,对象创建出来它就创建,对象销毁它也销毁。因此呢,类指定只有一个的,也就是只会被加载一次,那么由此引发的静态变量也就创建出这么独一份了,进而起到了单例的效果。而提供公共的调用方法getInstance(),这个方法时将类加载时创建的那个单例返回出去,因此别人想使用这个单例时,拿到的也就是独一份的了,地址也是相同的。至于那个微不足道的draw()方法,这不是重点,因为它是个成员方法,也就只有对象可以调用了,这个是用来测试我调用getInstance()时拿到的是SingletonBeanHunger这个类的对象而已。

通过上述的讲解大家也差不多的明白单例的概念以及简单实现逻辑,记住这几点:1、单例只能有一个实例。2、单例类必须自己创建自己的唯一实例。3、单例类必须给所有其他对象提供这一实例。其实单例模式吧它主要是解决一个全局使用的类频繁的创建和销毁的,毕竟有时太过频繁创建销毁实例,对JVM也是一个极大的挑战,所以当我们想控制实例的数目和节省系统资源时,不妨考虑下单例模式。他虽然优点不少,但是也有些不可避免的缺点,无参构造都被私有化了,那么当然不能被继承了,也就没有啥接口了,否则就和单一职责原则冲突了。


单例模式和它的六大战将

其实大家看到这个标题还是有点蒙的,六大战将是什么鬼,你怎么不说是四大天王呢,你咋不上天呢。(汗。。)其实六大战将就是六种实现方式了,因为最近在看部网络水文,其中就讲到欧洲第一杀手“皇帝”和他的八大战将,所以就想到了六大战将了,哈哈哈,我真乃人才也。。(还要不要脸。。)

战将一:伯爵(懒汉式-线程不安全)

这种方式是最基本的实现方式,这种实现最大的问题就是不支持多线程。因为没有加锁 synchronized,所以严格意义上它并不算单例模式。这种方式 lazy loading(延迟加载) 很明显,不要求线程安全,在多线程不能正常工作。

/**

  • 懒汉式加载-线程不安全

*/

public class SingletonBeanLazyDg {

private SingletonBeanLazyDg(){}

private static SingletonBeanLazyDg singletonBeanLazyDg;

public static SingletonBeanLazyDg getInstance(){

if(singletonBeanLazyDg == null){

singletonBeanLazyDg = new SingletonBeanLazyDg();

}

return singletonBeanLazyDg;

}

public void draw(){

System.out.println(“lazy-singleton-dangerous”);

}

}

战将二:耶稣(懒汉式-线程安全)

这种方式具备很好的 lazy loading(延迟加载),能够在多线程中很好的工作,但是,效率很低,99% 情况下不需要同步。

/**

  • 懒汉式加载-线程安全

*/

public class SingletonBeanLazy {

private SingletonBeanLazy (){}

private static SingletonBeanLazy singletonBeanLazy;

public static synchronized SingletonBeanLazy getInstance(){

if(singletonBeanLazy==null){

singletonBeanLazy = new SingletonBeanLazy();

}

return singletonBeanLazy;

}

public void draw(){

System.out.println(“lazy-singleton”);

}

}

战将三:野兽(饿汉模式)

这种方式没有加锁,执行效率会提高。但是类加载时就初始化,容易产生垃圾对象,浪费内存。 它基于 classloader 机制避免了多线程的同步问题,不过,instance 在类装载时就实例化,虽然导致类装载的原因有很多种,在单例模式中大多数都是调用 getInstance 方法, 但是也不能确定有其他的方式(或者其他的静态方法)导致类装载,这时候初始化 instance 显然没有达到 lazy loading (延迟加载)的效果。

/**

  • 饿汉式

*/

public class SingletonBeanHunger {

private SingletonBeanHunger(){}

private static SingletonBeanHunger singletonBeanHunger = new SingletonBeanHunger();

public static SingletonBeanHunger getInstance(){

return singletonBeanHunger;

}

public void draw(){

System.out.println(“hunger-singleton”);

}

}

战将四:鬼影(双检锁/双重校验锁(DCL,即 double-checked locking))

这种方式采用双锁机制,安全且在多线程情况下能保持高性能。

/**

  • 双重校验锁/双检锁

自我介绍一下,小编13年上海交大毕业,曾经在小公司待过,也去过华为、OPPO等大厂,18年进入阿里一直到现在。

深知大多数Java工程师,想要提升技能,往往是自己摸索成长或者是报班学习,但对于培训机构动则几千的学费,着实压力不小。自己不成体系的自学效果低效又漫长,而且极易碰到天花板技术停滞不前!

因此收集整理了一份《2024年Java开发全套学习资料》,初衷也很简单,就是希望能够帮助到想自学提升又不知道该从何学起的朋友,同时减轻大家的负担。
img
img
img
img
img
img

既有适合小白学习的零基础资料,也有适合3年以上经验的小伙伴深入学习提升的进阶课程,基本涵盖了95%以上Java开发知识点,真正体系化!

由于文件比较大,这里只是将部分目录大纲截图出来,每个节点里面都包含大厂面经、学习笔记、源码讲义、实战项目、讲解视频,并且后续会持续更新

如果你觉得这些内容对你有帮助,可以添加V获取:vip1024b (备注Java)
img

总结

我个人认为,如果你想靠着背面试题来获得心仪的offer,用癞蛤蟆想吃天鹅肉形容完全不过分。想必大家能感受到面试越来越难,想找到心仪的工作也是越来越难,高薪工作羡慕不来,却又对自己目前的薪资不太满意,工作几年甚至连一个应届生的薪资都比不上,终究是错付了,错付了自己没有去提升技术。

这些面试题分享给大家的目的,其实是希望大家通过大厂面试题分析自己的技术栈,给自己梳理一个更加明确的学习方向,当你准备好去面试大厂,你心里有底,大概知道面试官会问多广,多深,避免面试的时候一问三不知。

大家可以把Java基础,JVM,并发编程,MySQL,Redis,Spring,Spring cloud等等做一个知识总结以及延伸,再去进行操作,不然光记是学不会的,这里我也提供一些脑图分享给大家:

希望你看完这篇文章后,不要犹豫,抓紧学习,复习知识,准备在明年的金三银四拿到心仪的offer,加油,打工人!

一个人可以走的很快,但一群人才能走的更远。如果你从事以下工作或对以下感兴趣,欢迎戳这里加入程序员的圈子,让我们一起学习成长!

AI人工智能、Android移动开发、AIGC大模型、C C#、Go语言、Java、Linux运维、云计算、MySQL、PMP、网络安全、Python爬虫、UE5、UI设计、Unity3D、Web前端开发、产品经理、车载开发、大数据、鸿蒙、计算机网络、嵌入式物联网、软件测试、数据结构与算法、音视频开发、Flutter、IOS开发、PHP开发、.NET、安卓逆向、云计算

bbs.csdn.net/forums/4304bb5a486d4c3ab8389e65ecb71ac0)

AI人工智能、Android移动开发、AIGC大模型、C C#、Go语言、Java、Linux运维、云计算、MySQL、PMP、网络安全、Python爬虫、UE5、UI设计、Unity3D、Web前端开发、产品经理、车载开发、大数据、鸿蒙、计算机网络、嵌入式物联网、软件测试、数据结构与算法、音视频开发、Flutter、IOS开发、PHP开发、.NET、安卓逆向、云计算

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值