【Android每日一问】手撸单例以及优缺点分析,2021Android开发社招面试总结_android 每日一问_智恩架构师的博客-程序员秘密

技术标签: 程序员  架构  android  移动开发  

  • 优点:获取对象的速度快;避免了多线程的同步问题。
  • 缺点:类加载过程慢。

饿汉变种单例(静态内部类)

public class Singleton {

private Singleton() {

}
private static class SingletonHolder{
private static final Singleton INSTANCE = new Singleton();
}

public static Singleton getInstance() {
return SingletonHolder.INSTANCE;
}
}

  • 这种单例模式在第一次类加载时并不会初始化,只有在第一次调用getInstance()时虚拟机加载SingletonHolder并初始化SingleTon实例,也是线程安全的,也是推荐使用的。
  • 优点:线程安全,节约资源
  • 缺点:第一次加载时反应稍慢

为什么静态内部类是线程安全的?

首先了解一下静态内部类的优点:

  • 外部类加载时并不需要立即加载内部类
  • 内部类不被加载则不去初始化INSTANCE,故而不占内存
  • 具体来说当SingleTon第一次被加载时,并不需要去加载SingleTonHoler,只有当getInstance()方法第一次被调用时,使用INSTANCE的时候,才会导致虚拟机加载SingleTonHoler类。

那么是如何实现线程安全的?

在类加载的最后一个阶段:类的初始化,本质就是执行类构造器的<clinit>方法。<clinit>是由javac编译器生成的,JVM内部会保证一个类的<clinit>在多线程环境下被正确的加锁同步,简单来说就是如果有多个线程同时去做类的初始化工作,那么只有一个线程会执行<clinit>方法,其他线程会阻塞,直到执行完,其他线程唤醒,但是不会再次执行<clinit>方法。也就是说,一个类只会初始化一次。

再看上面的单例可以简单看出,这里对INSTANCE的赋值操作,编译之后实际上就是一个<clinit>代码,当我们执行getInstance()时,会导致SingletonHolder类的加载,类加载的最后会执行类的初始化操作,即使在多线程下<clinit>也只会被执行一次,所以他只有一个实例存在,从而避免多线程的问题。

懒汉单例

public class Singleton{
private static Singleton instance= null;

private static Singleton(){}

public static Singleton getInstance(){
if(instance==null){
instance = new Singleton();
}
return instence;
}
}

  • 这种模式只有在需要使用的时候才进行实例的初始化,在单线程下能够非常好的工作,但是在多线程下存在线程安全问题。
  • 优点:节约资源
  • 缺点:第一次加载时需要实例化,反应稍慢;多线程下不能正常工作

懒汉+线程安全单例

public class Singleton{
private static Singleton instance =null;

private static Singleton(){}

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

  • 这种模式为了解决多线程问题,采用了对函数进行同步的方式,但是比较浪费资源,因为每次都要进行同步检查,而实际中真正需要检查只是第一次实例化的时候。

尾声

评论里面有些同学有疑问关于如何学习material design控件,我的建议是去GitHub搜,有很多同行给的例子,这些栗子足够入门。

有朋友说要是动真格的话,需要NDK以及JVM等的知识,首现**NDK并不是神秘的东西,**你跟着官方的步骤走一遍就知道什么回事了,无非就是一些代码格式以及原生/JAVA内存交互,进阶一点的有原生/JAVA线程交互,线程交互确实有点蛋疼,但平常避免用就好了,再说对于初学者来说关心NDK干嘛,据鄙人以前的经历,只在音视频通信和一个嵌入式信号处理(离线)的两个项目中用过,嵌入式信号处理是JAVA->NDK->.SO->MATLAB这样调用的我原来MATLAB的代码,其他的大多就用在游戏上了吧,一般的互联网公司会有人给你公司的SO包的。
至于JVM,该掌握的那部分,相信我,你会掌握的,不该你掌握的,有那些专门研究JVM的人来做,不如省省心有空看看计算机系统,编译原理。

一句话,平常多写多练,这是最基本的程序员的素质,尽量挤时间,读理论基础书籍,JVM不是未来30年唯一的虚拟机,JAVA也不一定再风靡未来30年工业界,其他的系统和语言也会雨后春笋冒出来,但你理论扎实会让你很快理解学会一个语言或者框架,你平常写的多会让你很快熟练的将新学的东西应用到实际中。
初学者,一句话,多练。

由于文章篇幅问题复制链接查看详细文章以及获取学习笔记链接:前往我的GitHub

版权声明:本文为博主原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。
本文链接:https://blog.csdn.net/m0_66265052/article/details/122969740

智能推荐

小程序获取服务器的表单信息,微信小程序发送模版消息获取 formID 方法_calo hopehely的博客-程序员秘密

想要发送模板消息,首先需要获取到用户的 formId,因为用到获取用户 formId 的请求很大可能会复用,所以我这里把他放到app.js 里面封装起来,方便调用。请看代码:nofollow"&gt;util.js 下载地址//app.jsvar util = require('utils/util.js');App({onLaunch: function () {var that = this;...

服务器网卡显示,服务器网卡操作_寻古诗词网的博客-程序员秘密

ip [选项] 操作对象{link|addr|route...}#ip addr show # 显示网卡IP信息# ip addr add 192.168.0.1/24 dev eth0 # 设置eth0网卡IP地址192.168.0.1# ip addr del 192.168.0.1/24 dev eth0 # 删除eth0网卡IP地址#ip link ...

Python2.7 logging.config && logging.handlers_weixin_34183910的博客-程序员秘密

为什么80%的码农都做不了架构师?&gt;&gt;&gt; ...

求最长重复子串--算法与数据结构课程作业_StarDream-Online的博客-程序员秘密

暴力破解–最长重复子串文章目录暴力破解--最长重复子串本文知识点(你可能会学到):1. 求子串算法2.BF算法(串的模式匹配算法)3.求最长重复子串(遍历)完整代码end本文知识点(你可能会学到):求子串算法BF字符串匹配算法(进阶KMP算法更好)字符串中的所有子串进行遍历1. 求子串算法//求子串int seekSubString(string* sub,string* s,int start,int sub_len,int s_len)//子串,主串,子串开始位置,子串长度,主

css手风琴_weixin_57765347的博客-程序员秘密

&lt;!doctype html&gt;&lt;html&gt;&lt;head&gt;&lt;meta charset="utf-8"&gt;&lt;title&gt;无标题文档&lt;/title&gt; &lt;link rel="stylesheet" href="css/css.css"&gt;&lt;/head&gt;&lt;body&gt; &lt;div class="fontr"&gt; &lt;a...

org.springframework.http.converter.HttpMessageNotReadableException: Required request body is missing_qq_32143163的博客-程序员秘密

org.springframework.http.converter.HttpMessageNotReadableException: Required request body is missing

随便推点

IView 给Submenu增加click事件失效解决方案_dei5960的博客-程序员秘密

在浏览器中,打开开发者选项(F12)找出对应的class,给其添加一个点击事件,就可以了。具体的 document 操作,看这里 ----&gt;https://www.cnblogs.com/oukele/p/10014192.html实现效果的另一种方案:https://www.cnblogs.com/oukele/p/10191533.html转载于...

使用linux文件句柄恢复误删除的Oracle数据文件_a545578125的博客-程序员秘密

sdfsdfsdafasdfasdf 首先查看当前的数据文件及数据文件状态:SQL> select file_id,tablespace_name,file_name,status from dba_data_files;    FILE_ID TABLESPACE FILE_NAME                              STATUS---------

2008 r2 server sql 中文版补丁_SQL server2008R2 SP3补丁下载(补丁!)_谢雅颖的博客-程序员秘密

SQL Server 2008 R2 Service Pack 3 (SP3) is now available for download. SQL Server 2008 R2 service packs are cumulative and can be used to upgrade all releases of SQL Server 2008 R2 to Service Pack 3. ...

钢架品牌_bamao5628的博客-程序员秘密

Colnago,DeRosa,Bianchi,Gios,Cinelli意大利的五大自行车品牌,也就是所谓的一王四后。 //z 2014-12-08 12:56:09 L.23 '39831 [email protected] T727794647 .K.F4064690091[T54,L3045,R97,V2257]Colnago品牌历史:1944年,Ernestocolna...

BigSur下Safari14.1.1安装油猴插件(Tampermonkey)_safari支持14 插件_yimankeer的博客-程序员秘密

Tampermonkey for mac Safari是一款浏览器扩展和最为流行的用户脚本管理器,Tampermonkey 提供了诸如便捷脚本安装、自动更新检查、标签中的脚本运行状况速览、内置的编辑器等众多功能, 同时Tampermonkey还有可能正常运行原本并不兼容的脚本。Tampermonkey for Safari需要在App Store中购买才可以使用的这是油猴插件(Tampermonkey)的下载地址,新版本在App Store中是收费的。在BigSur 中Safari14.

QQ机器人 http://www.cnblogs.com/sukyboor/archive/2007/01/03/610451.html_chief1985的博客-程序员秘密

这个元旦假期过的比较奇怪,为了向远方的GF表示忠诚。除了1号和同学吃了个大锅饭之外,尽量做到了大门不出二门不迈,躲在闺房守岁:)。     在家闲着也不能干闲着,总得做点事情,想起前段时间一个师兄交代给我的任务:把若干个qq群串在一起。X国的政策一向比较Bt,你说开个群还要限制人数。H大在深圳有几千校友,一个群怎么可能放的下那么多人。好多在tx工作的师兄,明确告诉:我买通tx的人是不大可能了,搞一

推荐文章

热门文章

相关标签