java单例模式八种实现方式

饿汉式两种

懒汉式三种

双重检验

静态内部类

枚举

  • 一.饿汉式(两种)

    •  1.静态常量
 1 /**
 2  * @author 79282
 3  * 单列模式第一种 写法:饿汉式(静态常量)
 4  */
 5 public class Singleton01 {
 6     //私有化构造器
 7     private Singleton01() {
 8
 9     }
10
11     //私有静态常量
12     private static final Singleton01 INSTANCE = new Singleton01();
13
14     //get方法
15     public static Singleton01 getInstance() {
16         return INSTANCE;
17     }
18
19 }
20 class Test01{
21     public static void main(String[] args) {
22         Singleton01 instance01 = Singleton01.getInstance();
23         Singleton01 instance02 = Singleton01.getInstance();
24         System.out.println(instance01 == instance02);
25     }
26
27 }
    • 2.静态代码块
 1 /**
 2  * @author 79282
 3  * 饿汉式 静态代码块
 4  */
 5 public class Singleton02 {
 6     //私有化构造器
 7     private Singleton02() {
 8
 9     }
10
11     private static Singleton02 instance;
12     //静态代码块
13     static{
14         instance = new Singleton02();
15     }
16
17     public static Singleton02 getInstance() {
18         return instance;
19     }
20 }
21 class Test02{
22
23     public static void main(String[] args) {
24         Singleton02 instance01 = Singleton02.getInstance();
25         Singleton02 instance02 = Singleton02.getInstance();
26         System.out.println(instance01 == instance02);
27     }
28 }
  • 二.懒汉式(三种).

    •   1.线程不安全 不推荐使用
 1 /**
 2  * @author 79282
 3  * 懒汉式 (线程不安全)不可用
 4  */
 5 public class Singleton03 {
 6     //私有化构造器
 7     private Singleton03() {
 8
 9     }
10
11     private static Singleton03 instance = null;
12
13
14     public static Singleton03 getInstance() {
15
16         if (instance == null) {
17              instance = new Singleton03();
18         }
19         return instance;
20     }
21
22 }
23
24 class Test03 {
25     public static void main(String[] args) {
26         Singleton03 instance01 = Singleton03.getInstance();
27         Singleton03 instance02 = Singleton03.getInstance();
28         System.out.println(instance01 == instance02);
29     }
30 }
    •   2.线程安全的(使用同步方法) 不推荐使用
 1 /**
 2  * @author 79282
 3  * 懒汉式 线程安全的(使用同步方法) 不推荐使用
 4  */
 5 public class Singleton04 {
 6     //私有化构造器
 7     private Singleton04() {
 8
 9     }
10
11     private static Singleton04 instance = null;
12
13     public static synchronized Singleton04 getInstance() {
14         if (instance == null) {
15             instance = new Singleton04();
16         }
17         return instance;
18     }
19 }
20 class Test04{
21     public static void main(String[] args) {
22         Singleton04 instance01 = Singleton04.getInstance();
23         Singleton04 instance02 = Singleton04.getInstance();
24         System.out.println(instance01 == instance02);
25     }
26 }
    •   3.使用同步代码块(线程安全)

  

 1 /**
 2  * @author 79282
 3  * 懒汉式 使用同步代码块 不可用
 4  */
 5 public class Singleton05 {
 6     private Singleton05() {
 7
 8     }
 9
10     private static Singleton05 instance = null;
11
12     public static Singleton05 getInstance() {
13         if (instance == null) {
14             synchronized (Singleton05.class) {
15                 instance = new Singleton05();
16             }
17         }
18         return instance;
19     }
20 }
21
22 class Test05{
23     public static void main(String[] args) {
24
25         Singleton05 instance01 = Singleton05.getInstance();
26         Singleton05 instance02 = Singleton05.getInstance();
27         System.out.println(instance01 == instance02);
28
29     }
30 }
  • 三.双重检查(推荐使用)
 1 /**
 2  * @author 79282
 3  * 懒汉式 双重检验(推荐使用)
 4  */
 5 public class Singleton06 {
 6     private Singleton06() {
 7
 8     }
 9
10     private static Singleton06 instance = null;
11     public static Singleton06 getInstance() {
12         if (instance == null) {
13             synchronized (Singleton06.class) {
14                 if (instance == null) {
15                     instance = new Singleton06();
16                 }
17
18
19             }
20         }
21
22         return instance;
23     }
24 }
25 class Test06{
26     public static void main(String[] args) {
27         Singleton06 instance01 = Singleton06.getInstance();
28         Singleton06 instance02 = Singleton06.getInstance();
29         System.out.println(instance01 == instance02);
30     }
31 }
  • 四.使用静态内部类(推荐使用)
 1 /**
 2  * @author 79282
 3  * 静态内部类创建单例(推荐使用)
 4  */
 5 public class Singleton07 {
 6     private Singleton07() {
 7
 8
 9     }
10
11     //私有静态内部类
12     private static class SingletonInstance{
13         private static final Singleton07 INSTANCE = new Singleton07();
14     }
15
16     public static Singleton07 getInstance() {
17         return  SingletonInstance.INSTANCE;
18     }
19
20
21 }
22 class Test07{
23     public static void main(String[] args) {
24
25         Singleton07 instance01 = Singleton07.getInstance();
26         Singleton07 instance02 = Singleton07.getInstance();
27         System.out.println(instance01 == instance02);
28     }
29 }
  • 五.使用枚举(推荐使用)
 1 /**
 2  * @author 79282
 3  * 使用枚举 (推荐使用)/
 4  */
 5 public enum Singleton08 {
 6
 7     INSTANCE;
 8
 9 }
10 class Test08{
11     public static void main(String[] args) {
12         Singleton08 instance01 = Singleton08.INSTANCE;
13         Singleton08 instance02 = Singleton08.INSTANCE;
14         System.out.println(instance01 == instance02);
15     }
16
17 }

原文地址:https://www.cnblogs.com/dreamjujujia/p/11695198.html

时间: 2024-11-09 08:24:46

java单例模式八种实现方式的相关文章

(六-2)八种定位方式

1.XML 可扩展标记语言,标准通用标记语言的子集,是一种用于标记电子文件使其具有结构性的标记语言. 与HTML类似,但是他是为了传输和存储数据而非显示数据. 2.XPath XPath即为XML路径语言(XML Path Language),它是一种用来确定XML文档中某部分位置的语言. XPth用来对 XML 文档中的元素和属性进行遍历,除了可以查找XML的节点,也可以查找HTML节点,因为这两个结构类似. 当然现在前端和后端更多的交互都是用 Json 来传输 现在已经不用XML 3.八种定

Java的三种编译方式

通常Java有三种编译方式,编译方式不同,那么得到的.class的大小也不同. 1)默认编译方式:javac A.java 2)  调试编译方式:javac -g A.java 3)  代码编译方式:javac -g:none A.java 案例如下:类A public class A{ public static void main(String args[]){ for(int i=0;i<100000;i++){ A a = new A(); } } } 通过上面这三种编译方式,得到的.c

selenium对元素的八种定位方式

selenium提供了八种元素的定位方式: id id定位 name name属性定位 class_name 伪类名定位 tag_name 标签名定位 link_text 链接文本定位 partical_link_text 部分链接文本定位 xpath xpath路劲表达式定位 css_selector css选择器定位 八种定位方式的示例: from selenium import webdriverdriver=webdriver.Firefox() url="xxxx"drive

Selenium Webdriver元素定位的八种常用方式

在使用selenium webdriver进行元素定位时,通常使用findElement或findElements方法结合By类返回的元素句柄来定位元素.其中By类的常用定位方式共八种,现分别介绍如下. 1. By.name() 假设我们要测试的页面源码如下: <button id="gbqfba" aria-label="Google Search" name="btnK" class="gbqfba"><

java集合四种遍历方式

package conection; import java.util.Iterator;import java.util.LinkedList;import java.util.List; public class Ergodic { public static void main(String[] args) {     // TODO Auto-generated method stub    /*    * java集合类的四种遍历方式    *     */    List<Integ

Selenium Webdriver元素定位的八种常用方式(转载)

转自:http://www.cnblogs.com/qingchunjun/p/4208159.html 在使用selenium webdriver进行元素定位时,通常使用findElement或findElements方法结合By类返回的元素句柄来定位元素.其中By类的常用定位方式共八种,现分别介绍如下. 1. By.name() 假设我们要测试的页面源码如下: <button id="gbqfba" aria-label="Google Search" n

java的两种同步方式, Synchronized与ReentrantLock的区别

java在编写多线程程序时,为了保证线程安全,需要对数据同步,经常用到两种同步方式就是Synchronized和重入锁ReentrantLock. 相似点: 这两种同步方式有很多相似之处,它们都是加锁方式同步,而且都是阻塞式的同步,也就是说当如果一个线程获得了对象锁,进入了同步块,其他访问该同步块的线程都必须阻塞在同步块外面等待,而进行线程阻塞和唤醒的代价是比较高的(操作系统需要在用户态与内核态之间来回切换,代价很高,不过可以通过对锁优化进行改善). 区别: 这两种方式最大区别就是对于Synch

Redis的Java客户端Jedis的八种调用方式(事务、管道、分布式)介绍

jedis是一个著名的key-value存储系统,而作为其官方推荐的java版客户端jedis也非常强大和稳定,支持事务.管道及有jedis自身实现的分布式. 在这里对jedis关于事务.管道和分布式的调用方式做一个简单的介绍和对比: 一.普通同步方式 最简单和基础的调用方式: 1 @Test 2 public void test1Normal() { 3 Jedis jedis = new Jedis("localhost"); 4 long start = System.curre

Java客户端Jedis的八种调用方式

redis是一个著名的key-value存储系统,而作为其官方推荐的java版客户端jedis也非常强大和稳定,支持事务.管道及有jedis自身实现的分布式. 在这里对jedis关于事务.管道和分布式的调用方式做一个简单的介绍和对比:  一.普通同步方式 最简单和基础的调用方式, @Test  public void test1Normal() {      Jedis jedis = new Jedis("localhost");      long start = System.c