自定义博客皮肤VIP专享

*博客头图:

格式为PNG、JPG,宽度*高度大于1920*100像素,不超过2MB,主视觉建议放在右侧,请参照线上博客头图

请上传大于1920*100像素的图片!

博客底图:

图片格式为PNG、JPG,不超过1MB,可上下左右平铺至整个背景

栏目图:

图片格式为PNG、JPG,图片宽度*高度为300*38像素,不超过0.5MB

主标题颜色:

RGB颜色,例如:#AFAFAF

Hover:

RGB颜色,例如:#AFAFAF

副标题颜色:

RGB颜色,例如:#AFAFAF

自定义博客皮肤

-+
  • 博客(21)
  • 收藏
  • 关注

原创 深入理解java虚拟机第十三章

第十三章 线程安全与锁优化一 线程安全与互斥同步内容见java并发编程实战笔记二 非阻塞同步主要思想:先进性操作,如果没有其他线程争用共享数据,那操作就成功了;如果共享数据有争用,产生了冲突,那就采取其他补偿措施(例如不断尝试直到成功为止)。这类乐观指令常用的有:测试并设置,获取并增加,交换,比较并转换(CAS),加载连接/条件存储。其中CAS指令需要有三个操作数,分别是内存位置(可简单理解为变量...

2018-05-16 09:50:30 208

原创 深入理解java虚拟机第十二章

第十一章 Java内存模型与线程一 Java内存模型1. 主内存与工作内存Java内存模型规定了所有的变量都存储在主内存中。每条线程还有自己的工作内存,线程的工作内存保存了被该线程使用到的变量的主内存副本拷贝,线程对变量的所有操作都必须在工作内存中进行,而不能直接读写主内存中的变量。主内存主要对应于Java堆中的对象实例数据部分,而工作内存则对应于虚拟机栈中的部分区域。2. volatile变量v...

2018-05-14 15:10:29 226

原创 深入理解java虚拟机第十章笔记

第十章 早起(编译期)优化一 Javac编译器编译过程大致可以分为三个过程:解析与填充符号表的过程;插入式注解处理器的注解处理过程;分析与字节码生成过程。1. 解析与填充符号表解析过程由parseFiles()方法完成,包含经典编译原理中的词法分析和语法分析。词法分析是将源代码的字符流转变为标记(Token)集合。语法分析是根据Token序列构造抽象语法树的过程。抽象语法树(Abstract Sy...

2018-05-12 10:04:51 285

原创 深入理解java虚拟机第八章笔记

第八章 虚拟机字节码执行引擎一 运行时栈帧结构栈帧适用于支持虚拟机进行方法调用和方法执行的数据结构,它是虚拟机运行时数据区中的虚拟机栈的战元素。栈帧存储了方法的局部变量表,操作数栈,动态连接和方法返回地址等信息。每一个方法从调用开始到执行完成的过程,都对应着一个栈帧在虚拟机栈里面从入栈到出栈的过程。在活动线程中,只有位于栈顶的栈帧才是有效的,称为当前栈帧 Current Stack Frame,与...

2018-05-11 09:26:11 172

原创 深入理解java虚拟机第七章笔记

第七章 虚拟机类加载机制与那些编译时需要进行连接的语言不通,java中类型的加载,连接和初始化过程都是在运行期间完成的,这种策略虽然会增加一些性能开销,但是会为java应用程序提供高度的灵活性,java里天生可以动态扩展的语言特性就是依赖运行期动态加载和动态连接这个特点实现的。一 类加载的时机类的生命周期包括:加载,验证,准备,解析,初始化,使用和卸载7个阶段。其中,验证,准备,解析三个部分统称为...

2018-05-08 14:54:22 377

原创 深入理解java虚拟机第六章笔记

第六章 类文件结构一 Class类文件结构Class文件是一组以8位字节为基础单位的二进制流。文件格式采用一种类似C语言结构体的伪结构来存储数据,这种伪结构中只有两种数据类型:无符号数和表。无符号数属于基本数据类型,主要可以用来描述数字、索引符号、数量值或者按照UTF-8编码构成的字符串值,大小使用u1、u2、u4、u8分别表示1字节、2字节、4字节和8字节。表是由多个无符号数或者其他表作为数据项...

2018-05-02 14:48:56 142

原创 深入理解java虚拟机第四章笔记

第四章 虚拟机性能监控与故障处理工具一 JDK的命令工具1. jps:虚拟机进程状况工具可以列出正在运行的虚拟机进程,并显示虛拟机执行主类(Mam Class,main ( ) 函数所在的类)名称,以及这些进程的本地虛拟机唯一ID ( Local Virtual Machine Identifier,LVMID ) 。对于本地虚拟机进程来说,LVMID与操作系统的进程ID ( Process Id...

2018-04-27 14:49:04 204

原创 深入理解java虚拟机第三章笔记

第三章 垃圾收集器与内存分配策略程序计数器,虚拟机栈,本地方法栈这三个区域随线程而生,随线程而灭,栈中的栈帧随着方法的进入和退出而有条不紊的执行入栈和出栈操作,每一个栈帧中分配多少内存基本上是在类结构确定下来时就已知的。因此这几个区域不需要过多考虑回收的问题。而java堆和方法区的内存的分配都是动态的,故需要关注这一部分的内存回收。一 判断对象是否已死引用计数算法:用于判断对象是否存活的一种方式,...

2018-04-26 14:55:01 210

原创 深入理解java虚拟机第二章笔记

第二章 java内存区域与内存溢出异常一 运行时数据区域1. 程序计数器:是一块较小的内存空间,它可以看作是当前线程所执行的字节码的行号指示器。如果线程正在执行一个java方法,那这个计数器记录的是正在执行的虚拟机的字节码指令的地址(线程私有)。2. java虚拟机栈(线程私有):生命周期与线程相同。虚拟机栈描述的java方法执行的内存模型:每个方法在执行的同时都会创建一个栈帧用于存储局部变量表,...

2018-04-24 14:57:41 216

原创 java并发编程第十五章笔记

第十五章 原子变量与非阻塞同步机制一 比较并转换(CAS)CAS包含了三个操作数:需要读写的内存位置V,进行比较的值A,和拟写入的新值B。当且仅当V的值等于A时,CAS才会通过源自方式用B来更新V的值,否则不会执行任何操作。乐观锁就用到了此机制。CAS的典型使用模式: 首先从V中读取值A,根据A计算值B,然后通过CAS以原子操作将V的值A变为B。一个模拟的CAS:/** * 模拟CAS操作 *...

2018-04-23 15:39:34 121

原创 java编程实战第十四章笔记

第十四章 构建自定义的同步工具一 条件队列它使得一组线程(称之为等待线程集合)能够通过某种方式来等待特定的条件变成真。正如每个java对象都可以作为一个锁,每个对象同样可以作为一个条件队列,并且Object中的wait,notify和notifyAll方法就构成了内部条件队列的API。wait:wait是等待的意思,调用wait会自动释放锁,并请求系统挂起当前线程,从而使其他线程能够获得这个锁 n...

2018-04-23 10:16:53 191

原创 Java并发编程实战第十三章笔记

第十三章 显式锁一 Lock 与 ReentrantLock与内置加锁机制不同的是,LOck提供了一种无条件的,可轮训的,定时的以及可中断的锁获取操作,所有加锁和解锁的方法都是显式的。public interface Lock{ void lock(); void lockInterruptibly() throws InterruptedException; boolean tryLock...

2018-04-19 17:06:01 111

原创 java并发编程实战第十一章笔记

第十一章 性能与可伸缩性一 线程引入的开销:使用多个线程会引发额外的开销,这些开销包括:线程之间的协调(加锁,内存同步),上下文切换,线程创建和销毁和线程的调度等。如果过度使用线程,这些开销甚至大于由于提高吞吐量,响应性或者计算能力所带来的性能提升。1. 上下文切换 如果可运行的线程数大于CPU数量,那么操作系统会将某个正在运行的线程调度出来,保存当前线程执行的上下文(以便下次再次调度能保存进度)...

2018-04-18 15:22:15 153

原创 java编程实战第十章笔记

第十章 避免活跃性危险一 死锁死锁定义:当一个线程永远占有一个锁, 而其他线程尝试去获得这个锁, 那么它们将永远被阻塞。 例如:当线程占有锁L时, 想要获得锁M, 但是同时, 线程B持有M, 并尝试获得L, 两个线程将永远等待下去, 这种情况是死锁的最简单的形式 锁顺序死锁发生原因:当两个线程试图以不同的顺序来获得相同的锁时,例如public class Test { private fi...

2018-04-16 15:30:17 134

原创 java编程实战第八章笔记

第八章 线程池的使用1.线程饥饿死锁在线程池中,如果任务依赖于其他任务,那么可能导致死锁。在单线程的Executor中,第二个任务停留在工作队列中,等待第一个任务的完成,之后到第二个任务开始执行,而第一个任务又需要第二个任务完成的结果,因此这样就导致死锁。只要线程池中的任务需要无限期地等待一些必须由池中其它任务才能提供的资源或条件,例如某个任务等待另一个任务的返回值或执行结果,除非线程池足够大,否...

2018-04-14 10:15:19 145

原创 java并发编程第七章笔记

第七章 取消与关闭Java没有提供任何机制来安全地终止线程,但是它提供了中断,这是一种协作机制,能够使一个线程终止另一个线程的当前工作。1.通过取消标志可以用一个volatile类型的域来保存取消状态,在每次执行任务前都进行检查。但是这种方法有可能会产生问题,比如如果任务调用了一个阻塞方法,那么取消标志可能永远不会被检查,因此永远不会结束。2.通过中断Thread中的中断方法public clas...

2018-04-12 15:32:32 126

原创 java并发编程实战第六章笔记

第六章 任务执行1. Executor框架public interface Executor{ void execute(Runnable command);}该框架能支持多种不同类型的任务执行策略。它提供了一种标准的方法将任务的提交过程与执行过程解耦,并用Runnable来表示任务。Executor的实现还提供了对生命周期的支持,以及统计信息收集,应用程序管理机制和性能监视等机制。impor...

2018-04-10 15:19:32 153

原创 java并发编程实战第五章

第五章 基础构建模块5.1 同步容器类这些类实现线程安全的方式是:将它们的状态封装起来,并对每个公有方法都进行同步,使得每次只有一个线程能访问容器的状态。例如Vector和Hashtable。5.2 并发容器ConcurrentHashMap: 并不是使用同步容器类的方法,而是使用一种粒度更细的加锁机制来实现更大程度的共享,这种机制称为分段锁。与其他并发容器类一样,迭代器不会抛出Concurren...

2018-04-08 20:52:44 212

原创 java并发编程实战第四章笔记

第四章 对象的组合4.1 设计线程安全的类设计线程安全类的三个基本要素: 1. 找出构成对象状态的所有变量 2. 找出约束状态变量的不变性条件 3. 建立对象状态的并发访问管理策略4.2 实例封闭通过将封闭机制与合适的加锁策略结合起来,可以确保以线程安全的方式来使用非线程安全的对象。例如:public class PersonSet{ private final Set<P...

2018-04-08 09:52:34 231

原创 java并发编程实战第三章笔记

第三章 对象的共享3.1 可见性重排序:比如两步赋值操作,赋值的顺序可能会跟看到的顺序相反。在没有同步的情况下,编译器、处理器以及运行时等都可能对操作的执行顺序进行一些意想不到的调整。在缺乏足够同步的多线程程序中,要想对内存操作的执行顺序进行判断,几乎无法得出正确的结论。Volatile变量:用来确保将变量的更新操作通知到其它线程。当把变量声明为volatile类型后,编译器与运行时都会注意到这个...

2018-04-03 15:38:43 146

原创 java并发编程实战第二章笔记

第二章 线程安全性2.1 什么是线程安全性一个对象是否是需要是线性安全的,取决于它是否需要被多个线程访问 。当多个线程访问某个类时,不管运行时环境采用何种调度方式或者这些线程将如何交替执行,并且在主调代码中不需要额外的同步,这个类都能表现正确的行为,那么就说这个类是线程安全的。无状态对象:既不包含任何域,也不包含任何对其他类中域的引用。计算过程中的临时状态仅存在于线程栈上的局部变量中,并且只能由正...

2018-04-02 10:16:16 156

空空如也

空空如也

TA创建的收藏夹 TA关注的收藏夹

TA关注的人

提示
确定要删除当前文章?
取消 删除