JVM之类加载器上篇
首先我们先看一个示例程序:
package com.tfdd.test; /**
* @desc 类加载校验
* @author chenqm
* @date 2016年2月2日
*/
class Singleton{
private static Singleton singleton = new Singleton();
public static int count1 ;
public static int count2 = 0; private Singleton(){
count1++;
count2++;
} public static Singleton getInstance(){ return singleton;
} }
public class SingletonTest {
public static void main(String[] args) {
Singleton singleton = Singleton.getInstance();
System.out.println(singleton.count1);
System.out.println(singleton.count2);
}
}
猜猜输出的结果是什么?据说80%的java程序猿都会犯的错误!
1
0
就是这样一个结果,我们先不说为什么。接着讲我们的类加载器.
类的加载大致分为三个部分:加载,连接,初始化。
加载:查找并加载类的二进制数据
连接:1.验证(确保被加载类的准确性) 2.准备(为类的静态变量分配内存,并将其初始化为默认值) 3.解析(将类中的符号引用转化为直接引用)
初始化:为类的静态变量赋予正确的初始值(即赋上我们给出的值)
然后我们再看看java程序对类的使用方式:主动使用和被动使用。请注意下面我说的这句话
所有的JAVA虚拟机实现必须在每个类或接口被JAVA程序“首次主动使用”时才初始化他们。
那么什么叫主动使用?基本上分为6种情况:
--创建类的实例
--访问某个类或接口的静态变量,或者对该静态变量赋值
--调用类的静态方法
--反射
--初始化一个类的子类
--java虚拟机启动时被标明为启动类的类
了解了这些知识之后,我现在来回答之前的问题,
Singleton.getInstance(); 调用了类的静态方法,符合首次主动使用该类的情况!那么我们进入初始化阶段。
初始化已经属于类加载的第三步了,在第二步的连接的准备部分,已经赋过一次默认值了。所以应该是这样一个过程:
1.singleton = null;count1=0;count2=0
2.singleton = new Singleton(); 此时执行构造函数,结果为count1=1;count2=1
3.count1没有被我们赋值跳过初始化,count2赋值为0所以结果为count1=1;count2=0
(*注意) 类的静态变量赋值的顺序是按照代码的书写的顺序执行的。
修改代码如下:
package com.tfdd.test; /**
* @desc 类加载校验
* @author chenqm
* @date 2016年2月2日
*/
class Singleton{
public static int count1 ;
public static int count2 = 0;
private static Singleton singleton = new Singleton(); private Singleton(){
count1++;
count2++;
} public static Singleton getInstance(){ return singleton;
} }
public class SingletonTest {
public static void main(String[] args) {
Singleton singleton = Singleton.getInstance();
System.out.println(singleton.count1);
System.out.println(singleton.count2);
}
}
输出结果为
1
1
证明赋值的顺序是根据代码书写的先后顺序执行的!
JVM之类加载器上篇的更多相关文章
- JVM自定义类加载器加载指定classPath下的所有class及jar
一.JVM中的类加载器类型 从Java虚拟机的角度讲,只有两种不同的类加载器:启动类加载器和其他类加载器. 1.启动类加载器(Boostrap ClassLoader):这个是由c++实现的,主要负责 ...
- 【深入理解JVM】类加载器与双亲委派模型 (转)
出处: [深入理解JVM]类加载器与双亲委派模型 加载类的开放性 类加载器(ClassLoader)是Java语言的一项创新,也是Java流行的一个重要原因.在类加载的第一阶段“加载”过程中,需要通过 ...
- 1.1 jvm核心类加载器--jdk源码剖析
目录 前提: 运行环境 1. 类加载的过程 1.1 类加载器初始化的过程 1.2 类加载的过程 1.3 类的懒加载 2. jvm核心类加载器 3. 双亲委派机制 4. 自定义类加载器 5. tomca ...
- 【JVM】JVM之类加载器
一.前言 首先,小小测试,看是否已经掌握了JVM类加载的过程 1.1.测试一 class Singleton { private static Singleton sin = new Singleto ...
- JVM之类加载器下篇
除了自定义的类加载之外,jvm存在三种类加载器,并以一种父委托的加载机制进行加载. --启动类加载器,又称根加载器,是一个native的方法,使用c++实现.在java中我们用null标识,用于加载j ...
- 【深入理解JVM】类加载器与双亲委派模型
原文链接:http://blog.csdn.net/u011080472/article/details/51332866,http://www.cnblogs.com/lanxuezaipiao/p ...
- JVM学习一:JVM之类加载器概况
18年转眼就3月份都快结束了,也就是说一个季度就结束了:而我也因为年前笔记本坏了,今天刚修好了,那么也应该继续学习和博客之旅了.今年的博客之旅,从JVM开始学起,下面我们就言归正传,进入正题. 一.J ...
- (转)JVM——自定义类加载器
背景:为什么要自定义,如何自定义,实现过程 转载:http://blog.csdn.net/SEU_Calvin/article/details/52315125 0. 为什么需要自定义类加载器 网上 ...
- JVM虚拟机-类加载器子系统
转自博客:http://www.cnblogs.com/muffe/p/3541189.html 还有一些自己补充的知识点 一.类加载器基本概念 顾名思义,类加载器(class loader)用来 ...
随机推荐
- .net 第二周学习
这周更进一步的介绍了.net,通过作业的练习,有那么一点点的成就感,相对于前端,成就感还不是很大,但是我还是会继续加油 学习.net,看着他们周末只能呆在寝室写网页,顿时我就高兴了: ...
- PHP版微信公共平台消息主动推送,突破订阅号一天只能发送一条信息限制
2013年10月06日最新整理. PHP版微信公共平台消息主动推送,突破订阅号一天只能发送一条信息限制 微信公共平台消息主动推送接口一直是腾讯的私用接口,相信很多朋友都非常想要用到这个功能. 通过学习 ...
- java上传图片或者文件
package com.pat.postrequestemulator; import java.io.BufferedReader; import java.io.DataInputStream; ...
- JQuery图片轮播滚动效果(网页效果--每日一更)
今天,带来的是一个图片的轮播滚动效果! 先来看一下效果展示:亲,请点击这里 原理很简单,设置一个定时器,使图片列表在每隔一段时间后滚动一次.而循环效果,就是在每一滚动的时候,将第一张图片放到最后一张的 ...
- 海量用户-高并发SAAS产品测试上线流程
海量用户高并发SAAS产品测试上线流程 SAAS产品测试上线流程-以Web插件产品为例子 1 概述 在互联网产品中,IT公司之间更加注重产品功能之间的协作,SAAS形态的产品扮演着越来越重要的作用 ...
- 免费打造自己的个人网站,免费域名、免费空间、FTP、数据库什么的,一个不能少,没钱,也可以这么任性
作为一名程序猿,拥有自己的个人网站,是一件多么有逼格的事~~至于个人网站的好处嘛?那是多的说都说不完啊~~例如我们可以放自己的作品,展示自己的风采,放自己女神的照片(女神看到后会怎么样,自己想吧,哈哈 ...
- iOS——Core Animation 知识摘抄(三)
原文地址:http://www.cocoachina.com/ios/20150105/10827.html CAShapeLayer CAShapeLayer是一个通过矢量图形而不是bitmap来绘 ...
- 人机大战之AlphaGo的硬件配置和算法研究
AlphaGo的硬件配置 最近AlphaGo与李世石的比赛如火如荼,关于第四盘李世石神之一手不在我们的讨论范围之内.我们重点讨论下AlphaGo的硬件配置: AlphaGo有多个版本,其中最强的是分布 ...
- C# Azure 存储-分布式缓存Redis的新建&配置&查看
1. 介绍 Redis 是一款开源的,基于 BSD 许可的,高级键值 (key-value) 缓存 (cache) 和存储 (store) 系统.由于 Redis 的键包括 string,hash,l ...
- Java Spring-Spring与Quartz整合
关于spring mvc.mybatis.maven的整合,请看上一篇文章 Quartz是一个强大的可以在web端执行定时任务的jar包. 本篇文章分为两大不同配置,第一位xml配置,第二位注解配置 ...