码迷,mamicode.com
首页 > 编程语言 > 详细

多线程下的立即加载与延迟加载

时间:2020-06-05 13:31:56      阅读:65      评论:0      收藏:0      [点我收藏+]

标签:public   实现   return   image   对象创建   extends   ash   过多   创建   

一、概念释义

立即加载:也称为“饿汉模式”,就是使用类之前就已经将对象创建完毕,常见的方法就是将对象静态创建
延迟加载:也称为“懒汉加载”,就是在使用到的时候才进行创建,常见的方法为通过get()方法进行实例化。

二、具体例子

以下例子关于单例模式方法以及线程实现方法采取内部类实现

  1. 立即加载/饿汉模式:
      public class singleton_imme {
    
        //单例模式实现方式
        private static class TestObject{
            private static TestObject testObject = new TestObject();
    
            private TestObject(){
            }
    
            public static TestObject getInstance(){
                return testObject;
            }
        }
    
        //编写线程输入实例的哈希值
        private static class TestThread extends Thread{
            @Override
            public void run() {
                System.out.println(TestObject.getInstance().hashCode());
            }
        }
    
        public static void main(String[] args) {
            TestThread t1 = new TestThread();
            TestThread t2 = new TestThread();
            TestThread t3 = new TestThread();
    
            t1.start();
            t2.start();
            t3.start();
          }
      } 
    

运行结果:技术图片

立即加载通过getInstance()返回静态对象,容易理解这里不过多描述。
2. 延迟加载/懒汉模式
关于延迟模式加载,往往伴随着着线程安全与运行效率的对比沟通。关于这一块网上相当多的博客已进行讨论过,这里不在进行延伸。仅沟通目前常见的方法——DCL双检查锁机制。下面是具体例子:

  public class singleton_delay {
  
      //DCL双检查锁机制
      private static class TestObject{
          private volatile static TestObject testObject;
  
          private TestObject(){
          }
  
          public static TestObject getInstance(){
              if (testObject == null){
                  synchronized(TestObject.class){
                      if (testObject == null){
                          testObject = new TestObject();
                      }
                  }
              }
              return testObject;
          }
      }
  
      private static class TestThread extends Thread{
          @Override
          public void run() {
              System.out.println(TestObject.getInstance().hashCode());
          }
      }
  
      public static void main(String[] args) {
          TestThread[] threadList = new TestThread[10];
  
          for (TestThread th: threadList) {
              th = new TestThread();
              th.start();
          }
      }
  
  }

运行结果:技术图片

DCL双检查锁机制是通过双重监测对象是否为空,第一重锁不加线程锁,这样在多线程中进行判断,不会因为线程锁锁而降低效率。第二层时加上对应线程锁,避免出现线程安全问题。

多线程下的立即加载与延迟加载

标签:public   实现   return   image   对象创建   extends   ash   过多   创建   

原文地址:https://www.cnblogs.com/AllenStarkX/p/13048875.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!