简介
本文是尝试从虚拟机的角度来分析java线程的一些本质
线程模型
java的线程模型可以通过下图来说明:
一个对象都有一个相关的锁,每次只能由获得它的一个线程来操作。获得它的线程可以wait,放弃锁,进入等待区域,待被唤醒notify后,它会重新查看锁的状态,参与锁的竞争
虚拟机实现
查看class文件的汇编代码,可以看到,进入同步区域和退出同步区域分别由两条指令 monitorenter和monitorexit。两者之间的代码块每次只能有一个线程执行
同步
分为两种,同步语句和同步方法。同步语句首先得获得synchronized(obj) obj对象的锁,否则,同步语句块内的语句是不会执行的。同步方法是在方法前面加修饰符synchronize。同理,要执行该方法,得闲获取方法所属类的锁(其实是对Class对象上锁)。当同步块语句或者同步方法执行完,无论中间是否有异常,最终都会释放锁
内存模型
java内存模型分为主内存和工作内存。每个线程只能操作该工作内存内的数据。两种内存的之间的交互是按照一定协议的,即一个变量如何从主内存拷贝到工作内存、如何从工作内存同步回主内存之类的细节。内存模型定义了一下操作
lock:作用于主内存的变量,将它标志为一条线程单独占有
unlock:作用于主内存变量,把处于锁定状态的变量释放,可以被其他线程lock
read:作用于主内存的变量,把一个变量的值从主内存传输到线程的工作内存中,以便接下来的load动作使用
load:作用于工作内存的变量,将上步read的变量放入工作内存的变量副本中
use:作用于工作内存的变量, 将工作内存的变量传递给执行引擎
assign:作用于工作内存的变量,将执行引擎接收到的值赋值给工作内存的变量
store:作用于工作内存的变量,将工作内存的变量传送到主内存
write:作用于工作内存的变量,它把store操作从工作内存得到的变量值放入主内存的变量中
volatile
主要有两个作用:
1.保证对该变量的改变是对每个线程可见的(原理是,每次改变后强制同步到主内存,需要一定损耗)。
2.避免指令乱排
jvm的锁优化
1.自旋锁与自适应自旋
简单一点说,两个线程同时竞争一个锁,其中一个获得了,后面那个本来要阻塞的。为了减少阻塞带来的性能损失,让它自旋(忙循环),看看第一个锁是否很快释放锁。忙循环次数如果不是固定的,而是由前一次在同一个锁上的自旋时间及锁的拥有者的状态来决定的。就是自适应自旋了
2.锁消除
如果能判断不必要的锁,直接就消除相关锁
3.锁粗化
如果对连续的操作,使用了多个锁,可以同一个范围较大的锁来替换
4.轻量级锁
这个原理比较复杂,涉及到一些特定的锁结构。简单说明,跟传统的锁(重量级)不同,轻量级锁是通过尝试改变一个对象的锁标志位来实现加锁操作的
5.偏向锁
如果去详细了解了上面的轻量级锁,就发现他们原理是差不多的,只不过偏向锁偏向的第一个获得它的线程
参考资料
1.深入java虚拟机
2.深入理解java虚拟机
更多关于jvm的内容可以继续访问 www.iamcoding.com
分享到:
相关推荐
Java分布式应用学习笔记03JVM对线程的资源同步和交互机制
程序计数器:因为cpu会划分为时间片给多个线程执行,所以需要程序计数器记录下指令执行到具体的位置,当下次线程切换时,从记录的位置继续执行,同时它也是唯一不会发生OOM错误的。 本地方法栈与虚拟机栈在某些jvm...
Java学习笔记包含JVM、spring、源码分析、多线程、offer题解、设计模式、面试宝典.zip Java学习笔记,内容包括JVM,spring,hashMap实现源码分析,多线程,剑指offer题解,设计模式。然后根据面试的重点,又将很多从...
title: 黑马JVM学习笔记二 date: 2020-01-13 1:00:00 tags: JVM categories: JVM 黑马jvm 内存结构 内存结构总览图: 程序计数器 1.定义:Program Counter Register 程序计数器 (寄存器) 程序计数器是Java对物理...
软件工程师的学习笔记,包含网络、操作系统、设计模式、JVM、多线程与高并发、Spring、MySQL.....
java基础核心学习笔记
内部包含了jvm,spring,java多线程等等描述
xiaoshaDestiny:学习笔记,类库,面试QA learn-activemq 消息队列 ActiveMQ的使用,Spring整合ActiveMQ learn-data-tructure 数据结构 learn-design-pattern 设计模式 编码详解 learn-jedis Redis的客户端操作工具包 ...
本Jva(Java)学习笔记是一份深入且详尽的教程,不仅包括Java的基础知识,还融入了作者的个人见解和实际编程经验。内容涵盖: Java基础:数据类型、控制流、异常处理。 面向对象编程:类与对象、继承、多态、封装。...
Java架构面试笔试专题资料及经验(含答案)和学习笔记: ActiveMQ消息中间件面试专题.pdf Dubbo面试专题及答案(下).pdf Dubbo面试及答案(上).pdf java后端面试题答案.pdf Java基础面试题.pdf java多线程并发编程...
答:启动一个线程是调用start()方法,使线程所代表的虚拟处理机处于可运行状态,这意味着它可以由JVM调度并执行。这并不意味着线程就会立即运行。run()方法可以产生必须退出的标志来停止一个线程。 40.接口是否可...
一、JAVA SE基础 1、开发语言基本包括:数据类型、循环控制语句、数组、方法 2、面向对象:最终是面向接口编程的,封装...JAVA提供多线程、提供动态下载程序代码的机制、安全性,它的操作以字节码(class)文件形式保存
它由Sun Microsystems(现在是Oracle Corporation)的James Gosling等人在1995年推出,被设计为一种简单、健壮、可移植、多线程、动态的语言。Java的主要特点和优势包括以下几个方面: 跨平台性(Write Once, Run ...
Java架构面试专题寒冬(含答案)和学习笔记,介于有些地方只抛问题,不抛答案的恶劣行为,这这里整理下java的面试资料,其中包括:java基础,数据库,当前流行框架,服务器操作,多线程,JVM等,详细信息看见博客...
它由Sun Microsystems(现在是Oracle Corporation)的James Gosling等人在1995年推出,被设计为一种简单、健壮、可移植、多线程、动态的语言。Java的主要特点和优势包括以下几个方面: 跨平台性(Write Once, Run ...
它由Sun Microsystems(现在是Oracle Corporation)的James Gosling等人在1995年推出,被设计为一种简单、健壮、可移植、多线程、动态的语言。Java的主要特点和优势包括以下几个方面: 跨平台性(Write Once, Run ...
Java前后开发面试题,大厂进阶之路,基于JavaGuide、Cyc大佬、牛客...包含计算机网络知识、JavaSE、JVM、Spring、Springboot、SpringCloud、Mybatis、多线程并发、netty、MySQL、MongoDB、Elasticsearch、Redis、HBASE
Java前后开发面试题,大厂进阶之路,基于JavaGuide、Cyc大佬、牛客...包含计算机网络知识、JavaSE、JVM、Spring、Springboot、SpringCloud、Mybatis、多线程并发、netty、MySQL、MongoDB、Elasticsearch、Redis、HBASE
2022java面试题、JVM面试题、多线程面试题、并发编程、Redis面试题、MySQL面试题、Java2022面试题、Netty面试题 一、内容概览 本次分享的资源涵盖了Java面试的各个方面,从基础知识到高级技术,从数据库到框架应用...