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