单例模式有一下特点:
  1、单例类只能有一个实例。
  2、单例类必须自己自己创建自己的唯一实例。
  3、单例类必须给所有其他对象提供这一实例。

  单例模式确保某个类只有一个实例,而且自行实例化并向整个系统提供这个实例。正是由于这个特 点,单例对象通常作为程序中的存放配置信息的载体,因为它能保证其他对象读到一致的信息。例如在某个服务器程序中,该服务器的配置信息可能存放在数据库或 文件中,这些配置数据由某个单例对象统一读取,服务进程中的其他对象如果要获取这些配置信息,只需访问该单例对象即可。这种方式极大地简化了在复杂环境 下,尤其是多线程环境下的配置管理,但是随着应用场景的不同,也可能带来一些同步问题。    

  单例模式:
        饿汉式:类一加载就创建对象
        懒汉式:用的时候,采取创建对象

1.懒加载思想,延迟加载用的时候采取加载
    2.线程安全问题
        a.是否是多线程模式 是
        b.是否有共享数据 是,就一个对象
        c.是否有多条语句操作共享数据 是在判断对象是否为null是是就创建对象使用在if语句,在该语句执行处有可能被其他线程直接抢到。
//-------------------------------------------------代码分割线

 public class Teacher {
// 构造私有不能创建对象
private Teacher() { } // 类一加载不再直接创建对象,而是先赋值为null
private static Teacher t = null; // 通过方法创建对象
public synchronized static Teacher getTeacher() {
// 假设有三条线程,t1,t2,t3要执行此处的代码块,
if (t == null) {
// 首先t1抢到线程,创建一个对象,此时t2抢到进来后也会创建一个对象,然后t3又抢到了t3也创建了一个对象,单个对象肯定是不符合要求的
// 为了保证创建一次对象后就不在创建对象,对象在创建的时候其它线程是进不来的,,,将方法同步~
t = new Teacher();
}
return t;
}
}

//下面的类是测试,

 public class TeacherDemo {
public static void main(String[] args) {
Teacher t1 = Teacher.getTeacher();
Teacher t2 = Teacher.getTeacher();
System.out.println(t1 == t2); //true,说明是同一个对象 }
}

//=====================================//

//下面的是单利饿汉式

 public class Student {
// 构造私有
private Student() {
} // 自己造一个
// 静态方法只能访问静态成员变量,加静态
// 为了不让外界直接访问修改这个值,加private
private static Student s = new Student(); // 提供公共的访问方式
// 为了保证外界能够直接使用该方法,加静态
public static Student getStudent() {
return s;
}
}
 /*
* 单例模式:类在内存中只有一个对象
* 如何保证呢?
* 1.构造方法私有
* 2.在成员位置自己创建一个对象
* 3.通过一个公共的方法提供访问
* 在jdk中有一个类Runtime,就是采用单例模式的饿汉式写的。
*/
public class StudentDemo {
public static void main(String[] args) {
// 获得对象
// Student s1 = new Student().getStudent();
// Student s2 = new Student().getStudent();
Student s1 = Student.getStudent();
Student s2 = Student.getStudent();
System.out.println(s1 == s2);
System.out.println(s1);
System.out.println(s2);
}
}

//===========================//

// Runtime的简单介绍

 import java.io.IOException;

 /*
* Runtime类封装了运行时的环境。
* 每个 Java 应用程序都有一个 Runtime 类实例,使应用程序能够与其运行的环境相连接。
* 一般不能实例化一个Runtime对象,应用程序也不能创建自己的 Runtime 类实例,
* 但可以通过 getRuntime 方法获取当前Runtime运行时对象的引用。
* 一旦得到了一个当前的Runtime对象的引用,就可以调用Runtime对象的方法去控制Java虚拟机的状态和行为。
* 常见的应用有
* 1:执行外部程序(调用外部命令)
* 2:内存管理
*/ /**
* 该类的设计模式是饿汉式
* 每个 Java 应用程序都有一个 Runtime 类实例, 使应用程序能够与其运行的环境相连接。
* 可以通过 getRuntime方法获取当前运行时。
*/
public class RuntimerDemo {
public static void main(String[] args) throws IOException {
Runtime r = Runtime.getRuntime();
//r.exec("winmine");
//调用DOS命令执行一些操作。
r.exec("notepad"); //直接在控制台打开记事本
r.exec("shutdown"); //定时关机 }
}

java中的单例设计模式的更多相关文章

  1. Java中常用来处理时间的三个类:Date、Calendar、SimpleDateFormate,以及Java中的单例设计模式:懒汉式、饿汉式以及静态内部类式

    (一)java.util.Date类 1.该类有一个long类型的属性:用来存放时间,是用毫秒数的形式表示,开始的日期是从1970年1月1号 00:00:00.    2.该类的很多方法都已经过时,不 ...

  2. Java学习笔记——单例设计模式Singleton

    单例设计模式:singleton 解决的问题: 确保程序在运行过程中,某个类的实例instance只有一份. 特点: 1 构造函数私有化 2 自己内部声明自己 3 提供一个public方法,负责实例化 ...

  3. Java笔记(十一)……单例设计模式

    设计模式 解决某一类问题最行之有效的方法 Java中有23中设计模式 单例设计模式 解决一个类在内存中只存在一个对象 思路 将构造函数私有化 在类中创建一个本类对象 提供一个方法可以获取到对象 两种方 ...

  4. OC中的单例设计模式及单例的宏抽取

    // 在一个对象需要重复使用,并且很频繁时,可以对对象使用单例设计模式 // 单例的设计其实就是多alloc内部的allocWithZone下手,重写该方法 #pragma Person.h文件 #i ...

  5. iOS 中的单例设计模式

    单例设计模式:在它的核心结构中只包含一个被称为单例类的特殊类.例如文件管理中的NSUserDefault,应用程序中的UIApplication,整个应用程序就这一个单例类,负责应用程序的一些操作,单 ...

  6. IOS中的单例设计模式

    单例设计模式是IOS开发中一种很重要很常用的一种设计模式.它的设计原理是无论请求多少次,始终返回一个实例,也就是一个类只有一个实例.下面是苹果官方文档中关于单例模式的图片: 如图所示,左边的图是默认的 ...

  7. Java面向对象_单例设计模式

    单例设计模式:保证一个类仅有一个实例,并提供一个访问它的全局访问点 1.构造方法私有化 2.声明一个本类对象 3.给外部提供一个静态方法获取对象实例 两种实现方式:饿汉式和懒汉式 何种情况下使用呢?当 ...

  8. Python中的单例设计模式

    1)设计模式: 是前人工作的总结和提炼.通常,被人们广泛流传的设计模式.     某一问题的特定解决方案,使用设计模式是为了可重用代码,是代码更容易被人理解, 增加代码的可用性. 2)单例设计模式: ...

  9. Java 多线程之单例设计模式

    转载:https://segmentfault.com/a/1190000007504892 概念: Java中单例模式是一种常见的设计模式,单例模式的写法有好几种,这里主要介绍两种:懒汉式单例.饿汉 ...

随机推荐

  1. Android 关于ListView中adapter调用notifyDataSetChanged无效的原因

    话说这个问题已经困扰我很久了,一直找不到原因,我以为只要数据变了,调用adapter的notifyDataSetChanged就会更新列表,最近在做微博帐号管理这一块,想着动态更新列表,数据是变了,但 ...

  2. Android解决java.lang.OutOfMemoryError: bitmap size exceeds VM budget(转)

    昨天遇到这个问题就是从一个输入流里调用BitmapFactory.decodeStream(this.getContentResolver().openInputStream(uri))得到一个bit ...

  3. Fluentd 例子

    0. 安装.启动 安装 curl -L https://toolbelt.treasuredata.com/sh/install-redhat-td-agent2.sh | sh 更新:最近貌似会安装 ...

  4. throw 语句

    我们也可以写代码来抛出异常,抛出异常的语句时throw,其格式如下: throw 异常类的对象名 用throw抛出异常,一般放在方法内部.一个程序可以有多个throw.throw语句执行时,其后面的代 ...

  5. [转]jquery $(document).ready() 与window.onload的区别

    http://blog.csdn.net/xiebaochun/article/details/36375481 Jquery中$(document).ready()的作用类似于传统JavaScrip ...

  6. 使用 jQuery Deferred 和 Promise 创建响应式应用程序

    这篇文章,我们一起探索一下 JavaScript 中的 Deferred 和 Promise 的概念,它们是 JavaScript 工具包(如Dojo和MochiKit)中非常重要的一个功能,最近也首 ...

  7. linux:档案与目录管理

    几个常见的目录处理命令: cd(change directory):变更目录 pwd(print working directory):显示当前目录[目录为连结档,则只显示连结档的路径]([-P]不以 ...

  8. UITabBarController底层实现

    1.首先要了解:任何控制器,都能添加子控制器      UIViewController里面有一个方法:     - (void)addChildViewController:(UIViewContr ...

  9. IntelliJ IDEA 编译方式介绍

    编译方式介绍 相比较于 Eclipse 的实时自动编译,IntelliJ IDEA 的编译更加手动化,虽然 IntelliJ IDEA 也支持通过设置开启实时编译,但是不建议,因为太占资源了.Inte ...

  10. Debug 介绍

    Debug 设置