Java 单例模式的实现资料整理
这里有新鲜出炉的 Java 设计模式, 程序狗速度看过来!
Java 程序设计语言
java 是一种可以撰写跨平台应用软件的面向对象的程序设计语言, 是由 Sun Microsystems 公司于 1995 年 5 月推出的 Java 程序设计语言和 Java 平台 (即 JavaEE(j2ee), JavaME(j2me), JavaSE(j2se)) 的总称
这篇文章主要介绍了 Java 单例模式的实现的相关资料, 并附简单实例代码, 需要的朋友可以参考下
Java 单例模式的实现, 对 java 单例模式的几种实现方法进行了整理:
单例模式好多书上都是这么写的:
- public class SingleTon1 {
- private SingleTon1(){
- }
- private static SingleTon1 instance = null;
- public static SingleTon1 getInstance(){
- if(instance == null){
- instance = new SingleTon1();
- }
- return instance;
- }
- }
但是实际开发中是不会这么写的, 因为有一个严重的问题, 多线程并发访问的时候, 可能会产生多个实例!!
下面列举几个常用的方法:
1. 使用 synchronized 关键字
- package singleton;
- public class SingleTon1 {
- private SingleTon1() {}
- private static SingleTon1 instance = null;
- // 多线程问题解法一, 但是效率不高! 因为每次调用都会加锁!
- public static synchronized SingleTon1 getInstance() {
- if (instance == null) {
- instance = new SingleTon1();
- }
- return instance;
- }
- public void print() {
- System.out.println("thread_id:" + Thread.currentThread().getId());
- }
- private static Object object = new Object();
- // 很巧妙的方法, 只有在 null 的时候加锁, 之后就不加啦
- public static SingleTon1 getInstance2() {
- if (instance == null) {
- synchronized(object) {
- instance = new SingleTon1();
- }
- }
- return instance;
- }
- }
2. 加锁
- package singleton;
- import java.util.concurrent.locks.ReentrantLock;
- public class SingleTon2 {
- private SingleTon2() {}
- private static ReentrantLock lock = new ReentrantLock();
- private static SingleTon2 instance = null;
- public void print() {
- System.out.println("thread_id:" + Thread.currentThread().getId());
- }
- public static SingleTon2 getInstance2() {
- if (instance == null) {
- lock.lock();
- if (instance == null) { // 注意这里还要判断下!!
- instance = new SingleTon2();
- }
- lock.unlock();
- }
- return instance;
- }
- }
3. 利用静态变量:
- package singleton;
- public class SingleTon3 {
- public static void print() {
- System.out.println("thread_id:" + Thread.currentThread().getId());
- }
- public static Nested getNested() {
- return Nested.instance;
- }
- // 这个是单例创建的类
- static class Nested {
- private Nested() {}
- static Nested instance = new Nested();
- }
- }
以上就是常用的创建单例的模式:
Test 测试代码:
- package singleton;
- import singleton.SingleTon3.Nested;
- public class Test2 {
- public static void main(String[] args) {
- // TODO Auto-generated method stub
- Nested singleton;
- Myrunnable mm = new Myrunnable();
- Myrunnable m1 = new Myrunnable();
- Myrunnable2 m2 = new Myrunnable2();
- new Thread(m1).start();
- new Thread(m2).start();
- if(m1.singleton == m2.singleton){ // 是同一个
- System.out.println("是同一个");
- }else{
- System.out.println("不是同一个");
- }
- }
- }
- class Myrunnable implements Runnable{
- Nested singleton;
- @Override
- public void run() {
- // TODO Auto-generated method stub
- singleton = SingleTon3.getNested();
- SingleTon3.print();
- }
- }
- class Myrunnable2 implements Runnable{
- Nested singleton;
- @Override
- public void run() {
- // TODO Auto-generated method stub
- singleton = SingleTon3.getNested();
- SingleTon3.print();
- }
- }
输出:
是同一个
- thread_id:11
- thread_id:10
来源: http://www.phperz.com/article/18/0212/359557.html