单例

单例设计模式:
(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的使用上有了较好的改进,效率得到很大的提高,不过几个状态转换的原理还是一样。
进程:是一个正在执行的程序。
每一个进程执行都有一个执行顺序,该顺序是一个执行路径,或者叫一个控制单元。
线程:就是进程中的一个独立的控制单元。线程在控制着进程的执行。
一个进程中至少有一个线程。

希望同仁志士,前来参考以及指点!共同进步,发扬文化精神!转载请标明出处!
原文地址:https://www.cnblogs.com/liyongyong/p/7741578.html