
JVM
Tiffany小仙女
这个作者很懒,什么都没留下…
展开
-
Java内存模型与线程
内存间的交互操作:一个变量如何从主内存拷贝到工作内存,如何从工作内存同步回主内存的实现细节,Java内存模型定义了8种操作来完成,虚拟机实现细节,Java内存模型定义了以下8种操作来完成:lock(锁定):作用于主内存的变量,它把一个变量标识为一条线程独占的状态 unlock(解锁):作用于主内存变量,它把一个处于锁定状态的变量释放出来,释放后的变量才可以被其他线程锁定 read(读取):...原创 2018-08-13 18:44:40 · 128 阅读 · 0 评论 -
运行时栈帧结构
栈帧是用于支持虚拟机进行方法调用和方法执行的数据结构栈帧存储了方法的局部变量表,操作数栈,动态连接,方法返回地址等信息,每一个方法从调用开始直至执行完成的过程都对应着一个栈帧从入栈到出栈的过程局部变量:是一组变量值存储空间,用于存储方法参数和方法内部定义的局部变量最小单位:变量槽第二点:在初始化阶段程序员没有为类变量进行赋值也没有关系,类变量仍然具有一个确定的初始值,但局部变量...原创 2019-01-06 15:22:35 · 234 阅读 · 0 评论 -
类的加载
什么是类加载机制?一个.java 文件在编译后会生成一个或多个.class文件(若一个类中包含内部类,那么它会编译后会产生多个Class文件),但这些Class文件中描述的具体信息,最终都需要加载到虚拟机中才能被运行和使用。虚拟机把描述类的数据从Class文件加载到内存,并对数据进行校验,解析,初始化,形成最终可以被虚拟机使用的java类型的过程,称为虚拟机的类加载机制。类的加载时机以...原创 2019-01-05 21:07:26 · 178 阅读 · 0 评论 -
锁优化
一 自旋锁如果物理机器有一个以上的处理器,能让两个或两个以上的线程同时并行执行,我们就可以让后面请求锁的那个线程稍微等一下,但是不放弃处理器的执行时间,看看持有锁的线程是否很快就会释放锁。为了让线程等待,我们只需让线程执行一个忙循环(自旋),这项技术就是自旋锁。自旋等待本身虽然避免了线程切换的开销,但它是要占用处理器时间的,因此如果锁被占用的时间很短,自旋等待效果就会很好,但是如果锁占用处...原创 2018-10-02 10:45:30 · 101 阅读 · 0 评论 -
JVM——线程安全的实现方法
一互斥同步(悲观的并发策略)同步是指在多个线程并发访问共享数据时,保证共享数据在同一时刻只被一个线程使用。互斥是实现同步的一种手段,下面介绍两种互斥同步的手段:synchronized关键字和concurrent包中的重入锁ReentrantLocksynchronized关键字:synchronized关键字经过编译之后,会在同步块的前后分别形成monitorenter和monito...原创 2018-10-01 21:38:49 · 274 阅读 · 0 评论 -
Java语言中的线程安全
线程安全定义:当多个线程访问一个对象时,如果不用考虑这些线程在运行时环境下的调度和交替执行,也不需要考虑进行额外的同步,或者在调用方进行任何其他的写作操作,调用这个对象的行为都可以获得正确的结果,那这个对象时线程安全的。将Java语言中的各种操作共享的数据分为以下五类:不可变:一定是线程安全的,如用final关键字修饰的变量,String对象,枚举类型,部分Number子类,如Double...原创 2018-10-01 15:24:46 · 281 阅读 · 0 评论 -
第三章线程间的通信第一节
3.1.1不使用等待/通知机制实现线程间通信3.1.2什么是等待/通知机制两个线程完全是主动式地读取一个变量,在花费读取时间的基础上,读到的数据并不确定是否是想要的,因此需要“等待通知”机制3.1.3等待/通知机制的实现1wait()方法:作用是使当前执行代码的线程进行等待,该方法是Object类的方法,用来将当前线程置入“预执行队列”中,并在wait()所在代码行处停止执行,直到...原创 2018-09-19 15:50:00 · 100 阅读 · 0 评论 -
先行发生原则
先行并发原则是判断数据是否存在竞争,线程是否安全的主要依据,依据这个原则,我们可以通过几条规则一揽子地解决并发环境下两个操作是否存在冲突的所有问题Java内存模型下天然的先行发生关系,,这些先行发生关系无须任何同步器协助就已经存在,可以在编码中直接使用程序次序规则:在一个线程内,按照程序代码顺序,书写在前面的操作先行发生于书写在后面的操作 管程锁定规则:一个unlock操作先行发生与后面...原创 2018-09-18 19:01:29 · 473 阅读 · 0 评论 -
对于long和double型变量的特殊规则及原子性,可见性和有序性
Java内存模型要求lock,unlock,read,load,assign,use,store,write这8个操作都具有原子性,但对于64位的数据类型(long或double),在模型中定义了 一条相对宽松的规定,允许虚拟机将没有被volatile修饰的64位数据的读写操作划分为两次32位的操作来进行,即允许虚拟机实现选择可以不保证64位数据类型的load,store,read,write这4...原创 2018-09-18 17:53:17 · 616 阅读 · 0 评论 -
对于volatile型变量的特殊规则
关键字是Java虚拟机提供的最轻量级的同步机制当一个变量定义为volatile之后,它具有两种特性:保证此变量对所有线程的可见性:当一条线程修改了这个变量的值时,新值能立即同步到主内存中,因此其他线程可以立即得知该变量修改后的值。在以下两种情况下能保证线程的安全性,其余情况我们仍要通过加锁来保证原子性:运行结果并不依赖变量的当前值,或者能够确保只有单一的线程修改变量的值 变量不需要...原创 2018-09-18 14:23:50 · 621 阅读 · 0 评论 -
第13章线程安全与锁优化
线程安全当多个线程访问一个对象的时候,如果不用考虑这些线程在运行时环境下的调度和交替执行,也不需要进行额外的同步,或者在调用方进行任何其他的协调操作,调用这个对象的行为都可以获得正确的结果,那这个对象时线程安全的Java语言中各种操作共享的数据分为以下五类:不可变:用final来修饰一个基本数据类型或是对象所在的类 绝对线程安全:在Java API中标注自己是线程安全的类,大多数都不...原创 2019-01-09 09:36:30 · 149 阅读 · 0 评论