被动实例化

当爬虫遇到TikTok滑块:一份给开发者的verifyV2避坑指南与调试心得 本文详细解析了TikTok滑块验证码verifyV2的破解与优化策略,涵盖验证码触发机制、滑块图片获取、验证请求构造及高级调试技巧。通过实战案例和代码示例,帮助开发者有效应对复杂反爬机制,提升验证通过率。特别针对verifyV2系统的加密算法和轨迹模拟提供了专业解决方案。 阅读详情

                                            被动实例化

                                                -- 性能与资源占用之间的平衡

  译者注:
       本来没打算翻译这篇文章,但前段时间进行代码走查和bug Fix工作的时候,发现程  序代码中依然存在这样的问题.于是我就将这篇文章翻译了出来.供大家参考,其中翻译失误的地方还请大家指教.谢谢!

   概要:
       自从计算机诞生以来,为了避免浪费诸如内存这些有用的资源,软件性能和资源消耗之间的平衡一直就是个问题,可能有时候还会牺牲一些软件性能来达到这个目的。本专题探讨在Java编程中通过将对象的创建推迟到系统真正需要时刻完成来降低内存消耗的一种方法途径。(2400字数)

       当8位计算机主板上的内存从8KB一下子到64KB,我们为之而激动不已的时刻似乎就发生在不久前,回头看到我们现在使用的资源消耗如此之多而且还在不断增加的应用系统,在过去能够写出适应那少的可怜内存的系统程序确实让人惊讶。尽管我们现在有更多的内存资源可以使用,但从那些建立在以往诸多约束基础上的技术中,还是能够学到不少很有价值的经验。

       此外,Java编程不仅仅是书写一些部署到个人PC或工作站上的applet和应用程序.它已经深入涉足嵌入式系统的市场领域。现在的嵌入式系统的内存资源和计算能力仍然很有限.所以,很多以往面临的老问题就又重新出现在了涉足嵌入式设备领域的Java程序员面前。

       平衡资源与性能这些因素是一个很让人兴奋的设计话题:在嵌入式系统的设计开发中,没有任何一个解决方案是完美的。我们必须接受这个事实。所以,我们需要理解一些技术类型,也就是在现有的部署平台约束下,对较好的达到我们上面提到的平衡有用的技术。

       其中,一个有效的避免内存消耗的技术就是被动实例化,Java程序员们在实际工作中发现很有用处。利用被动实例化技术,程序会在某些资源第一次被使用的时候才去创建他。---这样做的同时就相当于释放出了有用的内存空间。在这个专题中,我们在类的装载和对象的创建两个方面探讨被动实例化的技术,并且对于单例模式的情况我们做了特殊考虑。这些资料来源于我的著作 Java实战: Design Styles & Idioms for Effective Java 中的第九个章节.

 主动初始化与被动初始化:一个例子

       如果你熟悉Netscapse网页浏览器并且曾经用过3.x 和4.x版。那么你肯定注意到了Java运行时机制在装载时的不同之处。在Netscape 3.0启动的时候,如果你注意闪动的屏幕,你就会发现他正在装载各种资源,其中包括Java.然而,在Netscape 4.X中,浏览器并没有装载Java运行时机制---直到你运行了包括<APPLET>标签的web页面后它才会被装载。 这两种解决方式体现出了主动实例化(装载它,以备万一)和被动实例化(直到他被请求才会装载,或者它根本不会用到)技术。

      对于这两种解决方案都存在一些缺点。一方面,经常地装载一种资源会潜在地浪费宝贵的内存资源,如果这些被装载的资源在会话期间根本不会用到。另一方面,对于被动初始化,如果先前资源没有被装载,在资源被第一次请求的时候,你要付出一定的装载时间。

  将被动实例化作为一种资源保持策略
        被动实例化在Java中可以分为两类。
           。类被动式装载
           。对象被动式创建

           类被动式装载
       
           Java 运行时机制已经内嵌了类的被动实例化操作。只有当类第一次被引用的 时候才会装载到内存中(同样也可以通过HTTP 从web服务器装载)
         
          MyUtils.classMethod();   //first call to a static class method
          Vector v = new Vector(); //first call to operator new
         
          类的被动装载是一个JAVA运行环境中很重要的功能,在某种情况下,它降低了内存的使用。在一个会话期内如果一部分程序从来都没有被执行,那么在那段程序中被引用到的类将不会把被装载。
 
          对象被动式创建
         
         对象的被动式创建和类的被动式装载是紧密联系的。在一个从未装载过的类型别上第一次使用New 关键字,Java运行时机制会为你装载它。对象的被动式创建相对于类的被动装载能够更大程度上降低内存的消耗.


         为了介绍对象被动式创建这个概念,让我门看一段简单的代码例子。这个例子主要是一个Frame使用MessageBox显示错误信息。
         
          public class MyFrame extends Frame
          {
            private MessageBox mb_ = new MessageBox();
            //private helper used by this class
             private void showMessage(String message)
               {
              //set the message text
              mb_.setMessage( message );
              mb_.pack();
              mb_.show();
              }
           }


        在上面这个例子中,当一个MyFrame实例被创建时,MessageBox的实例对象 mb_也会被创建。如果被创建的对象中还有对象需要创建,那么就会出现对象的递归创建。任何被实例化的或被分配到MessageBox的构造子中变量,都会在系统的heap中分配空间。如果在一个会话期中,MyFrame的实例没有被用来去显示错误信息的话,我们就浪费了没必要的内存。
 
        在这个相当简单的例子中,我们并不能发现被动对象创建有多么明显的优点,可是如果是一个更加复杂的类,在这个类中又使用了许多其他的类。这时候,你可能需要递归的实例化这些类。那么这些潜在的内存消耗是相当明显的。

       接下来,请看前面提到的例子的被动实现方法,在这个方法中,对象mb_在第一次调用showMessage()方法时被实例化(也就是说,直到它真正被程序需要的时候。)
 
  public final class MyFrame extends Frame
 
  {
  private MessageBox mb_ ; //null, implicit
  //private helper used by this class
  private void showMessage(String message)
  {
    if(mb_==null)//first call to this method
      mb_=new MessageBox();
    //set the message text
    mb_.setMessage( message );
    mb_.pack();
    mb_.show();
  }
}

       如果你仔细观察showMessage()方法,你会看到我们首先检测是否实例变量mb_等于Null.对于变量mb_在声明的时候没有对它进行进行实例化的情况,Java 运行时机制已经替我们处理了(译者注:会将引用类型的变量设为Null).因此,我们可以通过创建MessageBox实例对象,继续安全地执行程序.对于以后所有对showMessage()方法的调用都将会发现实例变量mb_不等于Null,因此会跳过对象创建这一步直接使用现有的实例。

一个真实世界的例子

       现在,让我们来看一个更加贴近实际的例子,在这个例子中,被动实例化在降低程序所使用的资源方面扮演了一个很重要的角色。

      假设我们应顾客的要求需要写一个系统,这个系统能够让用户分类文件系统中的图片并且能够提供一个工具用来浏览缩略图或全图。那么我们首先想到的实现方式就是写一个类在它的构造子中来装载图片。

public class ImageFile
{
  private String filename_;
  private Image image_;
  public ImageFile(String filename)
  {
    filename_=filename;
    //load the image
  }
  public String getName(){ return filename_;}
  public Image getImage()
  {
    return image_;
  }
}

       在上面的例子中,ImageFile在实例化Image对象时采用了积极的解决途径。这种设计方式保证了getImage()方法调用的时候image对象立即生效,以供使用。但是,这种实现方式不但在速度上会慢的让人感到痛苦(文件夹中存在很多图片的情况下),而且这种设计会消耗太多可用内存。为了避免这个潜在的问题,降低内存消耗,我们放弃了这种瞬间访问方式所带来的性能益处.你可能早就猜到了,我们可以使用被动实例化来达到我们的要求.

      下面是改动后的ImageFile类,它使用了和MyFrame类中的MessageBox实例变量一样的解决方法。

public class ImageFile
{
  private String filename_;
  private Image image_; //=null, implicit
  public ImageFile(String filename)
  {
    //only store the filename
    filename_=filename;
  }
  public String getName(){ return filename_;}
  public Image getImage()
  {

    if(image_==null)
    {
      //first call to getImage()
      //load the image...
    }
    return image_;
  }
}

       在这个版本中,只有在getImage()方法调用的时候,image_实例变量才被装载。这样改动的目的就是降低整体内存的使用量和装载动作的启动次数,同时我们为之付出的代价就是在第一次请求的时候装载它.这是被动实例化的另一特性--在内存使用受到约束的上下文环境中表现代理模式(Proxy pattern).


     上面展示出的被动初始化策略对于我们这个例子已经够了。但马上,你会看到这样的设计如果用在多线程的上下文环境中就需要更改了。

单例模式下的被动实例化

让我们来看一个单例模式的例子。下面就是这种模式在Java中的一般表现手法。

{
  private Singleton() {}
  static private Singleton instance_
    = new Singleton();
  static public Singleton instance()
  {
    return instance_;
  }
  //public methods
}

      在这个较普遍的单例模式版本,我们这样声明并初始化了instance_域成员:
static final Singleton instance_ = new Singleton();

       比较熟悉"四人帮"(Erich Gamma、Richard Helm、Ralph Johnson 和 John Vlissides 四人合著 Design Patterns: Elements of Reusable Object-Oriented Software一书)著作中所描述的C++单例模式的实现方式的读者可能会对我们没有将变量instance_的初始化动作推迟到instance()方法调用的时候发生而感到惊讶。因此,他们会认为应该使用被动实例化,象这样:

public static Singleton instance()
{

  if(instance_==null) //Lazy instantiation

    instance_= new Singleton();
  return instance_;
}

       上面列出的代码就是原封不动从"四人帮"的C++单例模式实例中拿过来的,而且这种方式也经常被说成是Java程序的典范。如果你已经对这种方式比较熟悉并且吃惊于我并没有以同样的方式列出Java的单例模式,你甚至于会认为在Java中我那样做完全没有必要。一旦你对各自语言的运行期环境差别不加思索就直接将代码从一种语言移植到另一个语言,那么出现上面的迷惑是很常见的。 }

      确切点说,"四人帮"的C++单例模式使用了被动初始化是因为在运行期无法保证对象的静态初始化的顺序。(请参考Scott Meyer的单例模式在C++中的替代实现方式)在Java中,我们完全不用担心这一点。

       由于Java运行期对于类装载和静态static实例变量的初始化的处理方式(译者注:类装载时刻类中的静态成员先于非静态成员变量被自动初始化而且只能被初始化一次),在单例模式中被动初始化的解决方式在JAVA中是没有必要的.先前,我们提到过类是什么时候以什么方式被装载。在运行时,一个只有public static方法的类是当他的方法被第一次调用的时候被装载的。就象这样

Singleton s=Singleton.instance();

       在程序中第一次调用Singleton.instance()将迫使Java运行时去装载类Singleton。由于instance_ 变量是被声明为静态static.Java运行时会在成功装载类之后对这个变量进行初始化。因此保证了Singleton.instance()方法能够返回一个完全初始化的单例,不知道你理解了吗?


被动初始化在多线程时的危险性
  
      在Java的一个具体的单例模式实现中使用被动实例化不仅是没有必要的,而且这样一来还会造成在多线程应用程序的上下文中危险性。让我们来考虑一下Singleton.instance()方法的被动实例化的实现方式,如果有两个或更多的独立线程正在试图通过instance()方法获取对象的引用。如果其中一个线程抢先一步执行了if(instance_==null)这个判断语句,但在她执行instance_=new Singleton()语句之前,另一个线程也已经进入了这个方法并成功执行了if(instance_==null)的判断,这时候就会出现脏数据现象。

       象我们刚才这个假设一旦出现,所带来的后果就是一个或更多的singleton对象被创建。假设,如果你的Singleton 类负责的是连接数据库或远程服务器的话,那可就真成了麻烦事了。这个问题一个简单的解决方式就是使用synchronized关键字来防止在多线程的情况下同时访问一个方法。

    synchronized static public instance() {...}
   
       但是,这样一来在广泛实现了单例模式的多线程程序中会存在问题,它将会阻止对instance() 方法的同步访问。而且调用一个同步方法通常比调用一个非同步的方法要慢。我们真正需要的同步策略是不该造成不必要的阻塞的.幸运的是,我们存在这样的解决方法。那就是我们所说的 "双重访问模式"(double-check idiom)

   双重访问模式
  
   使用双重访问模式来保护使用了被动实例化的方法,下面就是我们的具体实现方法
 
   public static Singleton instance()
{

  if(instance_==null) //don't want to block here

  {

    //two or more threads might be here!!!
    synchronized(Singleton.class)

    {

      //must check again as one of the

      //blocked threads can still enter
      if(instance_==null)

        instance_= new Singleton();//safe

    }

  }

  return instance_;
}


       在Singleton被构建之前,多个线程调用instance()方法时,"双重访问"方法可以通过同步来改善性能.一旦对象被实例化后,instance_变量就不再等于null了,同时也避免了阻塞其它同步调用者.

       在Java中使用多线程会使系统变的很复杂。其实,同步这个课题是很广泛的,Doug Lea已经专门就它著作了一本书:Concurrent Programming in Java。如果你现在正在涉足同步编程。那么我建议在你开始书写依赖多线程的复杂Java系统之前,你最好看一下这本书.

  总结:
 
       通常我们经常制定一些协议来满足客户的需求与期望或者更有效地利用有限的资源。理解Java中实现被动实例化的技术,再加上Java语言提供的丰富功能和运行时环境(JRE),可以帮助你设计出高效的,优美的,快速的软件系统。关于主动实例化还有主动和被动实现的深入调查评估资料可以到我们的著作里查到。

【扫地机器人】详细介绍扫地机器人软硬件测试和场景化测试 本文提出2025版扫地机器人全生命周期测试方案,涵盖实验室仿真、硬件台架、客户实景等全流程验证。测试以"清洁率≥95%、覆盖率≥98%、MTBF≥1000h"为核心指标,采用数字孪生与120套真实场景结合的双V模型。重点包括:传感器精度(LDS误差<±10mm)、清洁系统性能(10g粉尘吸入率≥99%)、动力续航(800次循环容量保持≥80%)等硬件测试;以及SLAM重定位(误差<5cm)、AI识别(mAP>92%)等软件验证。方案特别针对宠物家庭(毛发缠绕率≤3%)、 阅读详情

相关推荐

告别数据丢失焦虑:用Python手把手实现Reed-Solomon码(附完整代码)

本文详细介绍了如何使用Python实现Reed-Solomon纠错码(RS码),帮助开发者有效防止数据丢失。通过基础编解码实战、文件保护方案和高级性能优化技巧,读者可以轻松掌握这一前向纠错技术,应用于物联网、文件存储和网络传输等场景,提升数据可靠性。

weixin_42527160的博客 222

类的主动使用和被动使用

JVM规范了以下6种主动使用类的场景: 1.通过new关键字会导致类的初始化:这种是大家经常采用的初始化一个类的方式,它肯定会导致类的加载并且最终初始化。 2.访问类的静态变量,包括读取和更新会导致类的初始化,这种情况的示例代码如下 public class Simple{ static{ System.out.println("I will be initiali...

CCC的博客 1251

【Unity人物动画】SALSA With RandomEyes (语音生成嘴型/人物说话) 使用

SALSA使用探索 之前做项目时想做人物说话的嘴部动作,因为我们的语音是AI合成的,语音片段很多,如果能根据语音生成嘴部动画,那将极大便利我们的工作。后面是找到了SALSA的这款插件,并摸索出使用方法。 1 插件介绍 官方网站:https://crazyminnowstudio.com/ 一个能做2D纸片人和3D人物模型嘴部和眼睛动画的插件,由两人组成的独立工作室(疯狂米诺工作室)开发。 插件全名为SALSA With RandomEyes,2014年上架Asset Store,目前是已下架,替换为新版本

里约热内驴的博客 1万+

Android-11-SQLite数据库

1.介绍 SQLite是一个轻量级数据库,它的设计目标是嵌入式的,而且占用资源非常低,在内存中只需要占用几百KB 的存储空间。SQLite是遵守ACID的关系型数据库管理系统。这里的ACID是指数据库事务正确执行的4个基本要素,即原子性、一致性、隔离性、持久性.它能够支持Windows/Linux/UNIX等主流的操作系统,能够跟很多程序语言相结合。比起Mysql、 PostgreSQL这两款开源数据库管理系统来讲,SQLite的处理速度更快。SQLite没有服务器进程,它通过文件保存数据,该文件是跨平台

qq_42759120的博客 895

Ubuntu22.04安装ROS2 —— ROS2 humble 详细图文教程

本文详细介绍了如何在Ubuntu22.04(Jammy)系统下配置ROS2环境,安装RO2软件包,并验证安装成功。ROS2的版本是Humble Hawksbill。:ROS是一个开源的,提供硬件抽象、设备驱动、库、工具和通信机制,支持模块化开发与集成,广泛用于机器人控制和自动化应用。ROS2 相较于 ROS1 在架构设计、通信机制和平台支持等方面做出了改进。ROS1 采用集中式主节点(Master)进行节点间通信,存在单点故障风险,且实时性和跨平台支持较弱。

weixin_49649078的博客 8805

基于ADS1299的8通道脑电采集系统硬件设计实战

生物电信号采集是医疗电子与可穿戴设备中的关键环节,微弱信号的高保真放大与数字化处理直接影响系统性能。高精度模数转换器与低噪声模拟前端设计成为工程实践的核心。ADS1299作为专用生物电测量芯片,集成多通道低噪声放大器与24位Δ-Σ ADC,广泛应用于脑电、心电等生理信号检测。本文基于ADS1299构建8通道脑电采集系统,详细阐述硬件架构、电源与参考设计、输入保护、PCB布局布线、固件SPI配置及数据读取,并结合实测数据分享噪声抑制与调试经验,为EEG采集设备开发提供完整参考。

weixin_29169505的博客 223

微软官方的SQLHelper类(含完整中文注释)

[csharp] view plain copy print?using System;  using System.Data;  using System.Xml;  using System.Data.SqlClient;  using System.Collections;  namespace myhelper  {      /// <summary>      /// SqlServer

q1063823095的博客 5841

Linux 下 OpenClaw 安装全记录:从零到一的保姆级图文教程

本文主要介绍了Linux 下 OpenClaw 安装全记录:从零到一的保姆级图文教程,希望能对学习使用OpenClaw 的同学们有所帮助。 文章目录 1. 背景 2. 实战教程 2.1 步骤一 安装Node.js 2.2 步骤二:安装git 2.3 步骤三:安装并配置OpenClaw 2.4 步骤四:配置OpenClaw 2.5 步骤五:配置模型 2.6 步骤六:对话 3. 后续使用步骤 4. 报错解决方案 5. OpenClaw的卸载

weixin_43178406的博客 10万+

如何优化代码节约系统资源解决重复实例化对象的问题——神奇的单例模式(C#设计模式)...

有时候我们常常要在多处使用某一个类里的方法,但是若每一处都new一个实例实在是很耗系统资源的。这样重复的定义式很浪费,这时编程中的“单例模式”就应运而生了。 单例模式的特点就是虽然在多处使用,但使用的却是一个实例,请看下面代码它是如何办到的 using System; using System.Collections.Generic; using System.Text; namespa...

webcenterol 292

基于FPGA的7x7矩阵求逆verilog开发

up目录一、理论基础二、核心程序三、测试结果 矩阵求逆,即求矩阵的逆矩阵。矩阵是线性代数的主要内容,很多实际问题用矩阵的思想去解既简单又快捷。逆矩阵又是矩阵理论的很重要的内容,逆矩阵的求法自然也就成为线性代数研究的主要内容之一。设A是数域上的一个n阶方阵,若在相同数域上存在另一个n阶矩B,使得: AB=BA=E。 则我们称B是A的逆矩阵,而A则被称为可逆矩阵。其中,E为单位矩阵。典型的矩阵求逆方法有:利用定义求逆矩阵、初等变换法、伴随阵法、恒等变形法等。 逆矩阵的求法有多种,其中重要

FPGA/MATLAB学习教程/源码/项目合作开发 3898

论文研读 Corundum: An Open-Source 100-Gbps NIC

Corundum 通过在 FPGA 上构建并行 pipeline、高效 DMA 通道、无阻塞队列结构、低延迟调度器,实现了在 PCIe Gen3 x16 接口上稳定跑满 100Gbps 吞吐量。

Double Galaxy 489

js 函数常见的三种实例化方式

1 //工厂模式 2 function oj(){ 3 var lio=new Object(); //创建对象,对象属性赋值 4 lio.name='lio'; 5 lio.attr='男'; 6 lio.hobby=function(){ ...

weixin_34409741的博客 484

13、使用 Mathematica 撰写文本

本文详细介绍了如何使用 Mathematica 进行文本撰写与处理。内容涵盖文本输入、格式设置、结构化排版、超链接插入、翻译与拼写检查工具的使用,以及将笔记本导出为多种格式(如 PDF、HTML、LATEX 和 RTF)的方法。通过实例演示了创建专业文档的完整流程,包括样式设置、公式推导、标题编号、页眉页脚配置等操作。适合希望利用 Mathematica 编写学术论文、技术报告或教学资料的用户参考。

sony5的博客 208

被动实例化 -- 性能与资源占用之间的平衡

2004年翻译的一篇文章,现在看还是有些帮助,贴出来大家一起看看。 ======================================================= 译者注:        本来没打算翻译这篇文章,但前段时间进行代码走查和bug Fix工作的时候,发现程  序代码中依然存在这样的问题.于是我就将这篇文章翻译了出来.供大家参考,其中翻译失误的地方还请大家指教.谢谢

TechNerd的专栏 1522

计算机控制技术及应用

《计算机控制技术及应用》通过总结作者的科研成果和吸收国内外的先进理论、方法和技术,以计算机控制系统的网络化、开放化、智能化和集成化发展趋势为主线索,主要介绍计算机控制系统的基本概念和计算机控制系统的典型形式,计算机控制系统的数学描述与基本分析方法,以及数字PID控制器、最少拍控制系统、达林算法、状态变量设计法等设计方法及其各种改进算法。重点突出计算机控制系统输入输出通道接口的设计方法和典型控制系统的设计案例与实现方法等。

C# WinForm 基于DirectShow.dll编写的程序,可边预览边保存视频,音频和图片

基于微软的DirectShow.dll的二次开发1.自动识别连接的摄像头跟麦克风且可以对其进行选择(默认选中第一个)2.可录制wmv和avi两种格式的视频并且都带有音频,avi可以录制的分辨率和帧数进行选择,wmv默认进行了淸晰度优化如不喜欢可去除代码中有相关提示3.可在预览点开之后进行拍照,也可边录制视频边拍照4.添加了视频和音频的压缩功能(酌情使用)这次二次开发发现C#对DirectShow的相关信息太少,这次做完也不敢藏私共享出来,还望大家指正

类加载与实例化

类的加载 文章目录类的加载基本步骤加载过程示例分析类加载过程实例化过程类的主动与被动使用编译期常量变量初始化类加载器分类功能委派模式 基本步骤 类装载分为以下 5 个步骤: 加载:根据查找路径找到相应的 class 文件然后导入 检查:检查加载的 class 文件的正确性 准备:给类中的静态变量分配内存空间 解析:虚拟机将常量池中的符号引用替换成直接引用的过程。符号引用理解为一个标示,而直接引用...

Programmer Jett 701

Statistics and Machine Learning Toolbox

Statistics and Machine Learning Toolbox(带书签),MATLAB统计学习工具

类的初始化以及实例化

在类的初始化阶段,虚拟机对类进行初始化,主要对类变量进行初始化。在java中对类变量进行初始化有两种方式: ①声明类变量时指定初始值 ②使用静态初始化块为类变量指定初始化值 声明变量时指定初始值,静态初始化代码块**都被当成类的初始化语句**,他们无先后关系,谁写在前面就先初始化谁。 如果没有在这种方式中对类变量进行显式初始化,他将采用默认初始值(类准备阶段实现)。如下面a=5,b=6,c=0. (这里可以先了解类的声明周期https://zhuanlan.zhihu.com/p/67991761) p

qq_45382625的博客 4062

VC中sqlite的使用

在VC中对sqlite的使用,实现数据库大批数据的快速插入,读取数据库中的数据在ListCtrl中显示

天赐范式第126天:百度AI眼中的天赐范式——从“被动显现二重性“看外部评价的算子流走查

摘要:基于第86天理论框架,分析百度AI对天赐范式的外部评价,验证"被动显现二重性"。研究发现:1)百度AI评价呈现"样本截断偏差",准确度事实层0.75/定性层0.35;2)评价过程体现Ex算子运行(外部观察),走查过程体现Ψ_A运行(内省);3)同一AI系统因提问方式差异输出截然不同语调的回答。核心结论:外部评价作为"假眼"被Ex捕获,自我分析作为内省被Ψ_A捕获,完整呈现了第86天提出的被动显现二重性。技术协议v0.1在此实现"分析外部→分析自身→分析他人眼中的自己"的完整闭环。

snowoftheworld的博客 449

设计模式学习--单例模式

前段时间我的学长推荐我去看一下设计模式,说这个对我做的项目会有很大的帮助,于是就开始了设计模式的学习,感觉设计模式有点枯燥乏味,如果不跟着讲解例子敲代码的话,说不定没多久我估计就睡了。   单例模式是最常用的设计模式,在应用程序的整个生命周期中,对象只有一个实例的时候,就会使用单例模式。简而言之,就是在代码的最开始到最后,这个类只能定义一个对象,无法定义第二个对象。在单例模式的定义过程中,有两点

hjf161105的博客 428

设计模式——单例模式(学习笔记)

最近在学习设计模式,并决定把学习的东西写成笔记,也算是心得了吧。 ——前言 定义:单例模式就是当你希望在你的工程中有个只会实例化一次的类(或者说只有一个对象)时,需要使用的设计模式。既然使用这种模式的类只可能有一个对象,自然要提供一个随时访问的全局访问点。     用更专业点的话说,单例模式确保类仅有一个实例,并该类提供了一个全局访问点。 实现: 单线程 对于一个单线程的程序来说,

yangyang_cs的专栏 787

类的初始化和对象的实例化

类的实例化与类的初始化是两个完全不同的概念: 类的实例化是指创建一个类的实例(对象)的过程; 类的初始化是指为类中各个类成员(被static修饰的成员变量)赋初始值的过程,是类生命周期中的一个阶段。 虚拟机规范指明 有且只有 五种情况必须立即对类进行初始化(而这一过程自然发生在加载、验证、准备之后): 1) 遇到new、getstatic、putstatic或invokestatic这四条字节码指...

qq_37085033的博客 676

【JVM类加载】第一天类的加载,连接与初始化

类加载 在java代码中,类型的加载,连接与初始化过程都是在程序运行期间完成的 提供了更大的灵活性,增加了更多的可能性 类加载器 java虚拟机与程序的生命周期 在如下几种情况下,java虚拟机将结束生命周期: 执行System.exit()方法 程序正常执行结束 程序在执行过程中遇到了异常或错误向上抛出异常抛到main入口程序终止 由于操作系统出现错误而导致java虚拟机进程终止 类的加...

qq_42261668的博客 421

spring学习之IoC容器

  jinnianshilongnian 写道 理解IoC容器问题关键:控制的哪些方面被反转了? 1、谁控制谁?为什么叫反转? IoC容器控制,而以前是应用程序控制,所以叫反转 2、控制什么? 控制应用程序所需要的资源(对象、文件……) 3、为什么控制? 解耦组件之间的关系 4、控制的哪些方面被反转了? 程序的控制权发生了反...

yang 120

JVM中类的初始化时机

只有对类进行主动引用,才会触发其初始化方法,而除此之外的引用方式称之为被动引用,不会触发其初始化方法 1.主动引用 这里先定义一个Utils(名字随便起的,不要见怪)作为被测试类 package day12; /** * @author :weihuanwen * @date :Created in 2019/5/23 00:14 * @description : * @vers...

FloatDreamed的博客 300

JAVA对象的创建过程

背景 最近被问java对象的创建过程,当时一听感觉会又感觉不会?是类的加载过程还是JVM中new一个对象的过程? 然后就查资料整理了下,也给自己理理思路,顺便给大家分享下。 在网上搜了下实际就是类的初始化和实例化的问题,但是很多都是侧重说的是类执行的顺序,这里不写类的执行顺序只说两者的区别,如果后续有时间的话专门写一篇类执行顺序的文章。 基础知识 java类的生命周期 指一个class文件从加载到卸载的全过程,类的完整生命周期包括7个部分:加载——验证——准备——解析——初始化——使用——卸载,如下图所示

qq_18746961的博客 2611
上一篇: 几乎所有基于Java的web app都需要Model 2 (part II)
下一篇: 运用DBUnit进行高效单元测试
windowsDNA
博客等级 码龄23年 1粉丝 7原创
评论 1
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值