Java 单例模式的实现资料整理

作者:超超boy 时间:2022-05-29 21:27:33 

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.cnblogs.com/jycboy/p/5892185.html

标签:Java,单例模式
0
投稿

猜你喜欢

  • Java C++实现相同MD5加密算法的方式

    2023-10-12 12:26:02
  • Java虚拟机使用jvisualvm工具远程监控tomcat内存

    2023-11-28 22:15:49
  • Android使用JobScheduler定期推送本地通知实例代码

    2023-07-26 22:43:28
  • java IO流将一个文件拆分为多个子文件代码示例

    2023-08-30 12:46:15
  • 解决idea spring boot 修改html等不重启即时生效的问题

    2023-11-13 18:37:47
  • java中lambda表达式简单用例

    2023-11-24 23:17:52
  • java selenium Selenium IDE介绍及用法

    2023-11-21 06:41:22
  • Java基础之容器Vector详解

    2023-11-25 13:10:07
  • Java实现TopK问题的方法

    2023-11-10 20:32:14
  • Gradle:修改默认的Build配置文件名方式

    2023-11-28 20:18:01
  • RxJava2.x实现定时器的实例代码

    2023-08-06 17:41:01
  • flutter实现发送验证码功能

    2023-07-05 19:03:12
  • java之Object类用法实例

    2023-11-05 04:14:26
  • java中Object类4种方法详细介绍

    2023-11-03 16:06:12
  • Java真题实练掌握哈希表的使用

    2023-11-09 06:33:15
  • 一篇文章带你入门Java基本概念

    2023-11-26 01:17:08
  • 详解springboot和vue前后端分离开发跨域登陆问题

    2023-08-07 00:48:38
  • spring boot集成smart-doc自动生成接口文档详解

    2023-11-28 23:08:02
  • SpringBoot 创建web项目并部署到外部Tomcat

    2023-09-15 18:25:04
  • SpringBoot自动配置原理详解

    2023-08-19 09:25:55
  • asp之家 软件编程 m.aspxhome.com