今天我们来说说一个非常常用的模式,单例模式,单例模式让某个类中有自己的实例,而且只实例化一次,避免重复实例化,单例模式让某个类提供了全局唯一访问点,如果某个类被其他对象频繁使用,就可以考虑单例模式,以下用代码来分析:

饿汉式单例模式举例:

/*
* 饿汉式单例模式
* 饿汉式的这种单例模式是线程安全的
* 需要根据业务需求来觉得要不要使用饿汉式单例模式
*/
public class SingletonHungry { /*
* 直接以变量的形式实例化了当前对象,并进行了私有化,(这种方式的话在不管被不被使用,就已经实例化)
*/
private static SingletonHungry singletonHungry = new SingletonHungry(); public static SingletonHungry getInstance() {
return singletonHungry;
} public void printlnMethod() {
System.out.println("线程安全的饿汉式单例模式...");
} }

懒汉式单例模式

// 懒汉式单例模式
// 懒汉式的这种单例模式是线程不安全的,因为多线程并发性调用就会引发线程不安全问题
// 需要根据业务需求来觉得要不要使用懒汉式单例模式 public class SingletonLazy { /*
* 首先申明一个对象变量,变量都是必须私有化
*/
private static SingletonLazy singletonLazy = null; public static SingletonLazy getInstance() { if (null == singletonLazy) {
singletonLazy = new SingletonLazy();
}
return singletonLazy; } public void printlnMethod() {
System.out.println("懒汉式单例模式,线程不安全的,因为多线程并发调用会导致线程不安全");
}
}

以上的懒汉式单例模式,有不足之处,所以以下这个案例就是解决多线程并发调用引发的不安全问题:

/*
* 之前提到的懒汉式单例模式,存在多线程并发调用引发线程不安全问题,现在就增加同步来解决这个问题
*/
public class SingletonUpdate { private static SingletonUpdate singletonUpdate = null; public static SingletonUpdate getInstance() {
if (null == singletonUpdate) {
synchronized (SingletonUpdate.class) {
if (null == singletonUpdate) {
singletonUpdate = new SingletonUpdate();
}
}
}
return singletonUpdate;
} public void printlnMethod() {
System.out.println("懒汉式单例模式,线程不安全的,因为多线程并发调用会导致线程不安全
这个是Update升级版....");
}

关于线程的安全问题,对于为什么会出现安全问题,可以看Android-多线程安全问题-synchronized博客

测试程序:

// 测试程序
public class Main { public static void main(String[] args) { SingletonHungry.getInstance().printlnMethod(); SingletonLazy.getInstance().printlnMethod(); SingletonUpdate.getInstance().printlnMethod(); } }

运行结果:


静态内部类 单例模式:

package android.java.thread13;

/*
* 内部静态类 单例模式
*/
class SingletonState { private SingletonState() {} private static class SingletonClass {
public static SingletonState singletonState = new SingletonState();
} public static SingletonState getNewInstance() {
return SingletonClass.singletonState;
} public void printlnMethod() {
System.out.println("内部静态类 单例模式...");
} }

使用 静态内部类 单例模式:

package android.java.thread13;

/**
* 使用内部静态类 单例模式
*/
public class Main { public static void main(String[] args) {
// new SingletonState(); // 会报错 ❌
// new SingletonState(参数); // 会报错 ❌ // 实例化 内部静态类 单例模式
SingletonState singletonState = SingletonState.getNewInstance();
singletonState.printlnMethod();
} }

打印:

Android-Java单例模式的更多相关文章

  1. android java 设计模式详解 Demo

    android java 设计模式详解 最近看了一篇设计模式的文章,深得体会,在此基础我将每种设计模式的案例都写成Demo的形式,方便读者研究学习, 首先先将文章分享给大家: 设计模式(Design ...

  2. 单例模式:Java单例模式的几种写法及它们的优缺点

    总结下Java单例模式的几种写法: 1. 饿汉式 public class Singleton { private static Singleton instance = new Singleton( ...

  3. 用java单例模式实现面板切换

    1.首先介绍一下什么是单例模式: java单例模式是一种常见的设计模式,那么我们先看看懒汉模式: public class Singleton_ { //设为私有方法,防止被外部类引用或实例 priv ...

  4. .NET/android/java/iOS AES通用加密解密(修正安卓)

    移动端越来越火了,我们在开发过程中,总会碰到要和移动端打交道的场景,比如.NET和android或者iOS的打交道.为了让数据交互更安全,我们需要对数据进行加密传输.今天研究了一下,把几种语言的加密都 ...

  5. Android java传递int类型数组给C

    接着前面的文章<Android java传递int类型数据给C><Android java传递string类型数据给C>,继续实践 实现public native int[] ...

  6. Android java传递string类型数据给C

    本文接着实现<Android java传递int类型数据给C>的还未实现的方法: public native String sayHelloInC(String s); 先贴一个工具方法, ...

  7. .NET/android/java/iOS AES通用加密解密

    移动端越来越火了,我们在开发过程中,总会碰到要和移动端打交道的场景,比如.NET和android或者iOS的打交道.为了让数据交互更安全,我们需要对数据进行加密传输.今天研究了一下,把几种语言的加密都 ...

  8. android Java BASE64编码和解码二:图片的编码和解码

    1.准备工作 (1)在项目中集成 Base64 代码,集成方法见第一篇博文:android Java BASE64编码和解码一:基础 (2)添加 ImgHelper 工具类 package com.a ...

  9. 【深入】java 单例模式(转)

    [深入]java 单例模式 关于单例模式的文章,其实网上早就已经泛滥了.但一个小小的单例,里面却是有着许多的变化.网上的文章大多也是提到了其中的一个或几个点,很少有比较全面且脉络清晰的文章,于是,我便 ...

  10. CC++初学者编程教程(10) 搭建Android java C/C++ NDK QTforAndroid 开发环境

    1 安装JDK 2 点下一步 3 点下一步 4 开始安装 5 定制路径,点下一步 6 开始安装 7 安装完成, 8 解压缩 9 启动eclipse 10 看到启动画面 11 设置工作文件夹 12 单击 ...

随机推荐

  1. Numpy 学习 array np.where lexsort 切片 按行按列求平均mean

    array 的创建可以通过list给 array print出来像一个表格,可以按行按列来观察. 原来是一个list相当于一行 np.where用于寻找一个condition下的坐标,返回的是一个2个 ...

  2. Servlet会话管理三(HttpSession)

    Session是服务器端技术,服务器在运行时可以为每一个用户的浏览器创建一个其独享的HttpSession对象.由于Session为浏览器用户所独享,所以用户在访问服务器的web资源时,可以把各自的数 ...

  3. EXISTS 和 IN 的区别

    exists子句的用法 select * from 表1 where exists (select * from 表2 where 表1.列名=表2.列名); exists子句返回的结果并不是从数据库 ...

  4. 一个机器上运行两个tomcat

    一.   在一台计算机上配置2个tomcat是可以的,关键是tomcat里的server.xml文件中三个端口必须不同.需要修改conf/server.xml使两个tomcat占用的端口不相同,在缺省 ...

  5. java:static详解

    1.static修饰的变量习惯称为静态变量,static修饰的方法称为静态方法,static修饰的代码块叫做静态代码块. 1)static变量 static变量也称作静态变量,静态变量和非静态变量的区 ...

  6. 一波水题 MZOJ 1035: 贝克汉姆

    #include <bits/stdc++.h> using namespace std; ; int n,m; int v[N],w[N],f[N]; int main() { scan ...

  7. FMS4.5( Adobe Flash Media Server4.5)流媒体服务器搭建

    下载FMS4.5 下载地址:http://pan.baidu.com/s/1pJLi5Ur(已更新) FMS是用于用户之间相互通讯的新平台.它集成了Flash多媒体交互的特性,又添加了实时音频和实时数 ...

  8. ext中对json数据的处理解析

    看贴:http://blog.csdn.net/xieshengjun2009/article/details/5959687

  9. 解决Linux下IDEA无法使用ibus输入法的问题和tip乱码

    一:可以先按网上的配置/etc/profile里的输入法的一些参数,我是先配置了这些参数的,但是输入法还是没用,后来一直没管它了,今天用了一些方式可以了但不敢保证不需要先配置那些参数: 二:情况:开启 ...

  10. php 制作二维码 phpqrcode.php

    phpqrcode.php 下载地址:https://sourceforge.net/projects/phpqrcode/ //测试可行 utf-8格式 <?php header(" ...