随笔分类 - Java
摘要:ArrayList的扩容机制: 当向ArrayList中添加元素的时候,ArrayList的存储容量如果满足新元素的容量要求,则直接存储;ArrayList的存储容量如果不满足新元素的容量要求,ArrayList会增强自身的存储能力,以达到存储新元素的要求。 因为不同的JDK版本的扩容机制可能有差异
阅读全文
摘要:虚拟机把描述类的数据从Class文件加载到内存,并对数据进行校验、转换解析和初始化,最终形成可以被虚拟机直接使用的Java类型,这就是虚拟机的类加载机制。 一、类加载的时机1. 类从被加载到虚拟机内存开始,到卸载出内存为止,它的整个生命周期包括:加载、验证、准备、解析、初始化、使用、卸载7个阶段。
阅读全文
摘要:代码编译的结果从本地机器码转变为字节码,是存储格式发展的一小步,却是编程语言发展的一大步。 实现语言无关性的基础是虚拟机和字节码存储格式。Java虚拟机不和包括Java在内的任何语言绑定,只与"Class文件"这种特定的二进制文件所关联,Class文件中包含了Java虚拟机指令集合符号表以及若干其它
阅读全文
摘要:程序计数器、 虚拟机栈、 本地方法栈3个区域随线程而生,随线程而灭;栈中的栈帧随着方法的进入和退出而有条不紊地执行着出栈和入栈操作。 每一个栈帧中分配多少内存基本上是在类结构确定下来时就已知的,因此这几个区域的内存分配和回收都具备确定性,在这几个区域内就不需要过多考虑回收的问题,因为方法结束或者线程
阅读全文
摘要:1. Eclipse Memory Analyzer安装 Help ->Eclipse Marketplace,搜索Memory,点击install,->confirm->同意证书内容->finish。安装完成后重启。参考: Eclipse安装内存分析工具(Memory Analyzer) 2. 修
阅读全文
摘要:由于Java程序是交由JVM执行的,所以我们在谈Java内存区域划分的时候事实上是指JVM内存区域划分。在讨论JVM内存区域划分之前,先来看一下Java程序具体执行的过程: 首先Java源代码文件(.java后缀)会被Java编译器编译为字节码文件(.class后缀),然后由JVM中的类加载器加载各
阅读全文
摘要:1) 局部变量初始化(局部变量:函数、语句中的变量,只在所属区域内有效)局部变量声明后,Java虚拟机不会自动给它初始化为默认值。因此对于局部变量,必须经过显示的初始化,才能使用它。如果使用一个没有被初始化的局部变量,编译器会报错。 局部变量存储于虚拟机栈的局部变量表中例: 2) 对于类的成员变量,
阅读全文
摘要:HashMap不是线程安全的。在并发插入元素的时候,有可能出现环链表,让下一次读操作出现死循环。避免HashMap的线程安全问题有很多方法,比如改用HashTable或Collections.synchronizedMap. (Hashtable是对hashmap中的方法加上了Synchronize
阅读全文
摘要:一、HashMap介绍 1. 定义HashMap实现了Map接口,继承AbstractMap类。其中Map接口定义了键映射到值的规则,而AbstractMap类提供 Map 接口的骨干实现,以最大限度地减少实现此接口所需的工作,其实AbstractMap类已经实现了Map 2. 成员变量 table
阅读全文
摘要:在分析hashmap高并发场景之前,我们要先搞清楚ReHash这个概念。ReHash是HashMap在扩容时的一个步骤。HashMap的容量是有限的。当经过多次元素插入,使得HashMap达到一定饱和度时,Key映射位置发生冲突的几率会逐渐提高。这时候,HashMap需要扩展它的长度,也就是进行Re
阅读全文
摘要:在研究HashMap时,看到了取模方法,因此研究了下取模和取余的区别 一、取模与取余的区别取模:mod,取余:rem 当x和y的正负号一样的时候,两个函数结果是等同的;当x和y的符号不同时,rem函数结果的符号和x的一样,而mod和y一样。 这是由于这两个函数的生成机制不同,rem函数采用fix函数
阅读全文
摘要:1. 继承Thread类 (Thread类实现了Runnable接口:public class Thread implements Runnable)2. 实现Runnable接口3. 使用Callable和Future 实例代码:1. 继承Thread类 2. 实现Runnable接口(1) 方法
阅读全文
摘要:众所周知,用文本编辑器打开.class文件会乱码。我们可以使用命令行打开.class文件项目结构: 代码: cmd到~\ThreadTest\bin\testnew,即cmd到.class文件的同级目录下(.class文件在项目路径下的bin文件夹下),执行:javap -v Synchronize
阅读全文
摘要:一、中断 线程的几种状态:新建、就绪、运行、阻塞、死亡。参考:线程的几种状态转换 线程的可运行状态并不代表线程一定在运行(runnable != running ) 。 大家都知道:所有现代桌面和服务器操作系统都使用了抢占式的线程调度策略 。一旦线程开始执行,并不是总是保持持续运行状态的。当系统分给
阅读全文
摘要:一、final (一)、final的使用 final关键字可以用来修饰类、方法和变量(包括成员变量和局部变量) 1. 当用final修饰一个类时,表明这个类不能被继承。2. 当用final修饰一个方法时,表明这个方法不能被重写。3. 当用final修饰一个变量时,表明这个变量初始化后就不能再被修改。
阅读全文
摘要:一、synchronized的使用(一)、synchronized同步方法1. “非线程安全”问题存在于“实例变量”中,如果是方法内部的私有变量,则不存在“非线程安全”问题。2. 如果多个线程共同访问1个对象中的实例变量,则有可能出现“非线程安全”问题。3. synchronized取得的锁都是对象
阅读全文
摘要:在读很多并发文章中,会提及各种各样锁如公平锁,乐观锁等等,这篇文章介绍各种锁的分类。介绍的内容如下: 公平锁/非公平锁可重入锁独享锁/共享锁互斥锁/读写锁乐观锁/悲观锁分段锁偏向锁/轻量级锁/重量级锁自旋锁上面是很多锁的名词,这些分类并不是全是指锁的状态,有的指锁的特性,有的指锁的设计,下面总结的内
阅读全文
摘要:先看一段代码:启动两个线程,每个线程中让静态变量count循环累加100次。 几次不同的运行结果: 因为这段代码不是线程安全,所以最终的自增结果很可能会小于200.方法一:加上synchronized同步锁 (通过使用"类名.class"这个方式返回一个Class类型的对象,即获取一个类的“类对象”
阅读全文
摘要:一、Java当中CAS的底层实现首先看看AtomicInteger的源码,AtomicInteger中常用的自增方法 incrementAndGet: 这段代码是一个无限循环,也就是CAS的自旋。循环体当中做了三件事:1.获取当前值。2.当前值+1,计算出目标值。3.进行CAS操作,如果成功则跳出循
阅读全文
摘要:API文档中的描述: 先看一个例子 可以看出:put方法的返回值为null或value; 调用put方法时,如果已经存在一个相同的key, 则返回的是前一个key对应的value,同时该key的新value覆盖旧value;如果是新的一个key,则返回的是null; 通过hashmap的源码可以看出
阅读全文

浙公网安备 33010602011771号