Java最全Day307(1),深入浅出Java开发

最后

无论是哪家公司,都很重视基础,大厂更加重视技术的深度和广度,面试是一个双向选择的过程,不要抱着畏惧的心态去面试,不利于自己的发挥。同时看中的应该不止薪资,还要看你是不是真的喜欢这家公司,是不是能真的得到锻炼。

针对以上面试技术点,我在这里也做一些分享,希望能更好的帮助到大家。

本文已被CODING开源项目:【一线大厂Java面试题解析+核心总结学习笔记+最新讲解视频+实战项目源码】收录

需要这份系统化的资料的朋友,可以点击这里获取

return instance;

}

}

优缺点说明

优点

  • 写法简单,就是在类装载的时候就完成实例化。

  • 避免了线程同步问题

缺点

  • 在类装载的时候就完成实例化,没有达到 Lazy Loading 的效果。如果从始至终从未使用过这个实例,则会造成内存浪费

这种方式基于 classloder 机制避免了多线程的同步问题,不过,instance 在类装载时就实例化,在单例模式中大多数都是调用 getInstance 方法, 但是导致类装载的原因有很多种,因此不能确定有其他的方式(或者其他的静态方法)导致类装载,这时候初始化 instance 就没有达到 lazy loading 的效果

结论

  • 这种单例模式可用,可能造成内存浪费

四、饿汉式(静态代码块)


//饿汉式(静态代码块)

public class Singleton2 {

private Singleton2(){}

private final static Singleton2 instance;

static{

instance = new Singleton2();

}

public static Singleton2 getInstance(){

return instance;

}

}

优缺点说明

这种方式和上面的方式其实类似,只不过将类实例化的过程放在了静态代码块中,也是在类装载的时候,就执行静态代码块中的代码,初始化类的实例。优缺点和上面是一样的。

结论

  • 这种单例模式可用,但是可能造成内存浪费

五、 懒汉式(线程不安全)


//懒汉试(线程不安全)

public class Singleton3 {

private Singleton3(){}

private static Singleton3 instance;

public static Singleton3 getInstance(){

if (instance==null){

instance=new Singleton3();

}

return instance;

}

}

优缺点说明

起到了 Lazy Loading 的效果,但是只能在单线程下使用

如果在多线程下,一个线程进入了 if (singleton == null)判断语句块,还未来得及往下执行,另一个线程也通过了这个判断语句,这时便会产生多个实例。所以在多线程环境下不可使用这种方式

结论

  • 在实际开发中,不要使用这种方式.

六、懒汉式(线程安全,同步代码块)


//懒汉式(线程安全,同步代码块)

public class Singleton4 {

private Singleton4() {

}

private static Singleton4 instance;

public static Singleton4 getInstance() {

if (instance == null) {

synchronized (this) {

instance = new Singleton4();

}

}

return instance;

}

}

不推荐使用

七、 懒汉式(线程安全,同步方法)


//懒汉式(线程安全,同步方法)

public class Singleton5 {

private Singleton5() { }

private static Singleton5 instance;

public static synchronized Singleton5 getInstance() {

if (instance == null) {

instance = new Singleton5();

}

return instance;

}

}

优缺点说明

解决线程安全问题

效率低,每个线程在想获得类的实例时候,执行 getInstance()方法都要进行同步。而其实这个方法只执行一次实例化代码就够了,后面的想获得该类实例,直接 return 就行了。方法进行同步效率太低

结论

  • 在实际开发中,不推荐使用这种方式

八、双重检查


//双重检查

public class Singleton6 {

private Singleton6() {

}

private static volatile Singleton6 instance;

public Singleton6 getInstance() {

if (instance == null) {

synchronized (this) {

if (instance == null) {

instance = new Singleton6();

}

}

}

return instance;

}

}

优缺点说明

Double-Check 概念是多线程开发中常使用到的,如代码中所示,我们进行了两次 if (singleton == null)检查,这样就可以保证线程安全了。

这样,实例化代码只用执行一次,后面再次访问时,判断 if (singleton == null),直接 return 实例化对象,也避免的反复进行方法同步.

线程安全;延迟加载;效率较高

结论

  • 在实际开发中,推荐使用这种单例设计模式

总结

虽然我个人也经常自嘲,十年之后要去成为外卖专员,但实际上依靠自身的努力,是能够减少三十五岁之后的焦虑的,毕竟好的架构师并不多。

架构师,是我们大部分技术人的职业目标,一名好的架构师来源于机遇(公司)、个人努力(吃得苦、肯钻研)、天分(真的热爱)的三者协作的结果,实践+机遇+努力才能助你成为优秀的架构师。

如果你也想成为一名好的架构师,那或许这份Java成长笔记你需要阅读阅读,希望能够对你的职业发展有所帮助。

image

本文已被CODING开源项目:【一线大厂Java面试题解析+核心总结学习笔记+最新讲解视频+实战项目源码】收录

需要这份系统化的资料的朋友,可以点击这里获取

)、天分(真的热爱)的三者协作的结果,实践+机遇+努力才能助你成为优秀的架构师。

如果你也想成为一名好的架构师,那或许这份Java成长笔记你需要阅读阅读,希望能够对你的职业发展有所帮助。

[外链图片转存中…(img-Cazgh4DK-1715302609515)]

本文已被CODING开源项目:【一线大厂Java面试题解析+核心总结学习笔记+最新讲解视频+实战项目源码】收录

需要这份系统化的资料的朋友,可以点击这里获取

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值