「Android」单例的五种写法
单例
发现博客园可以很好的设置自己的博客文章的展示,很开心,然后特此发一篇
其实这几种写法大家应该都会的,就权当拿来记录一下吧,以后复习巩固也比较方便。
这篇文章中的代码,来自一篇视频(我想找视频贴上,但我没找到,以后有机会看到再贴吧,实不好意思),上面有讲到,我觉得很好,择录了一些下来。
1.
//懒人写法|原始
//缺点:类加载的时候就初始化实例,会拖慢应用启动速度
public class PlainOldSingleton {
private static PlainOldSingleton INSTANCE = new PlainOldSingleton();
private PlainOldSingleton(){}
public static PlainOldSingleton getInstance(){
return INSTANCE;
}
}
2.
//懒加载
//缺点:不是线程安全的,有可能线程A和线程B来同时访问INSTANCE的话,会new出两个实例,如果有多个线程的话,就会new出多个实例
public class LazyNotThreadSafe{
private static LazyNotThreadSafe INSTANCE;
private LazyNotThreadSafe(){}
public static LazyNotThreadSafe getInstance(){
if(INSTANCE == null){
INSTANCE = new LazyNotThreadSafe();
}
return INSTANCE;
}
}
3.
//同步锁
//缺点:每次获取都会加锁,会有一定的性能开销
//优点:线程安全
public class LazyThreadSafeSynchronized{
private static LazyThreadSafeSynchronized INSTANCE;
private LazyThreadSafeSynchronized(){}
public static synchronized LazyThreadSafeSynchronized getInstance(){
if(INSTANCE == null){
INSTANCE = new LazyThreadSafeSynchronized();
}
return INSTANCE;
}
}
4.
//双重验证
//面试多考,volatile是java1.5之后的一个内容,要理解这个需要懂Java虚拟机
public class LazyThreadSafeDoubleCheck{
private static voltatile LazyThreadSafeDoubleCheck INSTANCE;
private LazyThreadSafeDoubleCheck(){}
public static LazyThreadSafeDoubleCheck getInstance(){
if(INSTANCE == null){
synchronized (LazyThreadSafeDoubleCheck.class){
if(INSTANCE == null){
INSTANCE = new LazyThreadSafeDoubleCheck();
}
}
}
return INSTANCE;
}
}
5.
//静态内部类
//优雅,实现了懒加载和线程安全,线程安全利用了虚拟机的机制
public class LazyThreadSafeStaticInnerClass{
private static class Holder{
private static LazyThreadSafeStaticInnerClass INSTANCE == new LazyThreadSafeStaticInnerClass();
}
private LazyThreadSafeStaticInnerClass(){}
public static LazyThreadSafeStaticInnerClass getInstance(){
return Holder.INSTANCE;
}
}
「Android」单例的五种写法的更多相关文章
- java单例的几种写法
转载出处:http://cantellow.javaeye.com/blog/838473 第一种(懒汉,线程不安全): public class Singleton { private static ...
- Java基础系列-单例的7种写法
原创文章,转载请标注出处:https://www.cnblogs.com/V1haoge/p/10755322.html 一.概述 Java中单例有7种写法,这个是在面试中经常被问到的内容,而且有时候 ...
- Java并发编程中的设计模式解析(二)一个单例的七种写法
Java单例模式是最常见的设计模式之一,广泛应用于各种框架.中间件和应用开发中.单例模式实现起来比较简单,基本是每个Java工程师都能信手拈来的,本文将结合多线程.类的加载等知识,系统地介绍一下单例模 ...
- java23种设计模式之二: 单例设计模式(6种写法)
目的:在某些业务场景中,我们需要某个类的实例对象的只能有一个,因此我们需要创建一些单例对象. 本文共有6种写法,仅供参考 1.饿汉式 优点: 在多线程情况下,该方法创建的单例是线程安全的(立即加载) ...
- .NET Core中延迟单例另一种写法【.NET Core和.NET Framework的beforefieldinit差异】
1.BeforeFieldInit是什么 前段时间在反编译代码时无意间看到在类中有一个BeforeFieldInit特性,处于好奇的心态查了查这个特性,发现这是一个关于字段初始化时间的特性[提前初始化 ...
- [Android] 按钮单击事件的五种写法
在平时学习安卓的过程中,不论是看视频还是看博客,我发现每个人对代码的写法都有不同的偏好,比较明显的就是对控件响应事件的写法的不同.所以我想把这些写法总结一下,比较下各种写法的优劣,希望可以让自己可以灵 ...
- java单例的几种实现方法
java单例的几种实现方法: 方式1: public class Something { private Something() {} private static class LazyHolder ...
- iOS单例的两种实现
单例模式算是开发中比较常见的一种模式了.在iOS中,单例有两种实现方式(至少我目前只发现两种).根据线程安全的实现来区分,一种是使用@synchronized,另一种是使用GCD的dispatch_o ...
- 「python」: arp脚本的两种方法
「python」: arp脚本的两种方法 第一种是使用arping工具: #!/usr/bin/env python import subprocess import sys import re de ...
随机推荐
- ThinkPHP 5隐藏public/index.php方法
1.复制public下的index.php与.htaccess文件至根目录: 2.直接修改index.php,将内容修改为:<?php require 'public/index.php'; ? ...
- [Leetcode]895.最大频率栈
Problem 实现 FreqStack,模拟类似栈的数据结构的操作的一个类. FreqStack 有两个函数: push(int x),将整数 x 推入栈中. pop(),它移除并返回栈中出现最频繁 ...
- [EXP]IIS全版本提权工具
工具: iislpe.exe 编译: .net 3.5 全版本IIS提权工具,支持IIS应用池用户/网络服务用户/本地服务用户 原理: 通过NTLM重放将权限提升至SYSTEM权限,详情参 ...
- react-native热更新之CodePush详细介绍及使用方法
react-native热更新之CodePush详细介绍及使用方法 2018年03月04日 17:03:21 clf_programing 阅读数:7979 标签: react native热更新co ...
- java提高(1)---异常
异常 一.异常与错误的区别 再讲异常之前我们就应该要知道异常和错误的区别 Error类和Exception类的父类都是throwable类,他们的区别是: Error类一般是指与虚拟机相关的问题,如系 ...
- webstorm基础使用
因为需要用到sass自动编译,从sublime转到了webstorm.现在自我感觉sublime需要的插件太多,而webstorm很多功能都帮你及成,不需要你去找插件和安装插件. webstorm的好 ...
- Poi 生成xls
来首小诗: 今日不胜昨日寒,我却把那拖鞋穿,脚儿冰冰秋风瑟,抬头一看碧蓝天. ---泥沙砖瓦浆木匠 项目需求: p2p项目中,需要一些数据报表一xls的格式,提供下载.并给主管签名. ...
- 【原创】uC/OS II 任务切换原理
今天学习了uC/OS II的任务切换,知道要实现任务的切换,要将原先任务的寄存器压入任务堆栈,再将新任务中任务堆栈的寄存器内容弹出到CPU的寄存器,其中的CS.IP寄存器没有出栈和入栈指令,所以只能引 ...
- Ubuntu 下 Galera cluster for MySQL 集群安装
mysql galera cluster官网:http://galeracluster.com/documentation-webpages/ 相关安装教程:(不一定管用) http://blog.c ...
- python三大神器之fabric(2.0新特性)
fabric经常出现在自动化运维领域,批量处理一些运维工作.fabric是在paramiko之上又封装了一层,操作起来更加简单易用. 本来只是想写个博客记录一下,然后发现之前写的代码不能运行了,报以下 ...