zoukankan      html  css  js  c++  java
  • 单例

    单例设计模式:
    (1)设计模式:
    解决某类问题行之有效的方法,是一种思想,是规律的总结
    (2)用来保证某个类在内存中只有一个对象
    (3)保证唯一性的思想及步骤
    **为了避免其他程序建立该类对象,先禁止其他程序建立该类对象,即将构造函数私有化
    **为了其他程序访问到该类对象,须在本类中创建一个该类私有对象
    **为了方便其他程序访问到该类对象,可对外提供一个公共访问方式

    比如API中的Runtime类就是单例设计模式。

    (4)单例设计模式的两种方式

     1 A:饿汉式 当类加载的时候,就创建对象。    
     2 class Student
     3 {
     4 private Student(){}
     5 
     6 private static final Student s = new Student();
     7 
     8 public static Student getInstance()
     9 {
    10 return s;
    11 }
    12 }
    13 
    14 
    15 B:懒汉式 当使用的使用,才去创建对象。
    16 class Student
    17 {
    18 private Student(){}
    19 
    20 private static final Student s = null;
    21 
    22 public static Student getInstance()
    23 {
    24 if(s==null) 
    25 {
    26 //线程1就进来了,线程2就进来了。
    27 s = new Student();
    28 }
    29 return s;
    30 }
    31 }

    饿汉式和懒汉式的区别:
    **
    饿汉式是类一加载进内存就创建好了对象;
    懒汉式则是类在加载进内存的时候,对象还没有存在,只有调用了getInstance()方法时,
    对象才开始创建。
    **
    懒汉式是延迟加载,如果多个线程同时操作懒汉式时就有可能出现线程安全问题,解决线程安全问题
    可以加同步来解决。但是加了同步之后,每一次都要比较锁,效率就变慢了,
    所以可以加双重判断来提高程序效率(链接地址: http://blog.csdn.net/wguoyong/article/details/50918322)。

     1 实例1:
     2 public class TestInstance{
     3 private static TestInstance instance;
     4 public static TestInstance getInstance{
     5 if(instance==null){
     6 synchronized(TestInstance.class){ 
     7 if(instance==null){
     8 instance=new TestInstance();
     9 } 
    10 }
    11 return instance;
    12 } 
    13 }
    14 }
    15 实例2:
    16 public static SingletonTwo getInstance() { 
    17 //位置1 
    18 if (instance == null) { 
    19 //位置2 
    20 synchronized (instance) { 
    21 //位置3 
    22 if (instance == null) { 
    23 //位置4 
    24 instance = new SingletonTwo(); 
    25 } 
    26 } 
    27 } 
    28 return instance; 
    29 }


    注:开发常用饿汉式,因为饿汉式简单安全。懒汉式多线程的时候容易发生问题
     小小的作下解释:
      1、线程的实现有两种方式,一是继承Thread类,二是实现Runnable接口,但不管怎样,当我们new了这个对象后,线程就进入了初始状态;
      2、当该对象调用了start()方法,就进入可运行状态;
      3、进入可运行状态后,当该对象被操作系统选中,获得CPU时间片就会进入运行状态;
      4、进入运行状态后情况就比较复杂了
      4.1、run()方法或main()方法结束后,线程就进入终止状态;
      4.2、当线程调用了自身的sleep()方法或其他线程的join()方法,就会进入阻塞状态(该状态既停止当前线程,但并不释放所占有的资源)。当sleep()结束或join()结束后,该线程进入可运行状态,继续等待OS分配时间片;
      4.3、线程调用了yield()方法,意思是放弃当前获得的CPU时间片,回到可运行状态,这时与其他进程处于同等竞争状态,OS有可能会接着又让这个进程进入运行状态;
      4.4、当线程刚进入可运行状态(注意,还没运行),发现将要调用的资源被synchroniza(同步),获取不到锁标记,将会立即进入锁池 状态,等待获取锁标记(这时的锁池里也许已经有了其他线程在等待获取锁标记,这时它们处于队列状态,既先到先得),一旦线程获得锁标记后,就转入可运行状态,等待OS分配CPU时间片;
      4.5、当线程调用wait()方法后会进入等待队列(进入这个状态会释放所占有的所有资源,与阻塞状态不同),进入这个状态后,是不能自动唤 醒的,必须依靠其他线程调用notify()或notifyAll()方法才能被唤醒(由于notify()只是唤醒一个线程,但我们由不能确定具体唤醒的是哪一个线程,也许我们需要唤醒的线程不能够被唤醒,因此在实际使用时,一般都用notifyAll()方法,唤醒有所线程),线程被唤醒后会进入锁 池,等待获取锁标记。
      总算全部回忆了一遍JDK1.5在API的使用上有了较好的改进,效率得到很大的提高,不过几个状态转换的原理还是一样。
    进程:是一个正在执行的程序。
    每一个进程执行都有一个执行顺序,该顺序是一个执行路径,或者叫一个控制单元。
    线程:就是进程中的一个独立的控制单元。线程在控制着进程的执行。
    一个进程中至少有一个线程。

    希望同仁志士,前来参考以及指点!共同进步,发扬文化精神!转载请标明出处!
  • 相关阅读:
    [笔记]: 树链剖分 2017-06-05 16:57 35人阅读 评论(0) 收藏
    [笔记]: 最小生成树Kruska 2017-06-05 16:52 34人阅读 评论(0) 收藏
    [笔记]: 并查集 2017-06-05 16:49 58人阅读 评论(0) 收藏
    [bzoj2144]: 跳跳棋 2017-06-02 15:53 42人阅读 评论(0) 收藏
    [noip2013] 货车运输(最大生成树+并查集+LCA) 2017-06-02 15:18 56人阅读 评论(0) 收藏
    [练习] LCA练习1(最基础) 2017-06-02 11:54 39人阅读 评论(0) 收藏
    [笔记]: RMQ算法(区间查询) 2017-06-01 18:06 44人阅读 评论(0) 收藏
    [笔记]: LCA最近公共祖先 2017-06-01 11:38 38人阅读 评论(0) 收藏
    [hdu&poj&洛谷] 经典线段树练习题 2017-06-01 08:10 56人阅读 评论(0) 收藏
    保留X位小数(Double) swift
  • 原文地址:https://www.cnblogs.com/liyongyong/p/7741578.html
Copyright © 2011-2022 走看看