本地线程

jvm运行时数据区之程序计数器

我与影子孤独终老i 提交于 2019-12-04 18:50:21
什么是程序计数器? 程序计数器是一块 较小 的内存空间,它可以看做是当前线程所执行的字节码的 行号指示器 ;在虚拟机的概念模型里(仅仅是概念模型,各种虚拟机可能会通过一些更高效的方式去实现),字节码解释器工作时,就是通过改变这个计数器的值来选取下一条需要执行的字节码指令,分支、循环、跳准、异常处理、线程恢复等基础功能都需要依赖这个计数器来完成 ; ———–摘抄自 周志明版 《深入理解java虚拟机》 P39 简单的理解为,是程序计数器保证了程序的正常执行 ; 有什么特点 线程私有的 是java虚拟机规范里面, 唯一 一个 没有规定任何 OutOfMemoryError 情况的区域 生命周期随着线程,线程启动而产生,线程结束而消亡 为什么具有这些特点 要想理解什么是程序计数器,以及它的特点,需要理解上文中的一句话 这里重点理解 :程序计数器,可以看做是当前线程执行的字节码的 行号指示器 ,这句话;要理解这句话,需要先知道字节码文件长什么样子,看下面的代码 // java 文件被翻译为字节码的时候,字节码大概类似于下面的样子 public void haha(){ // 原来的 haha 方法内部的 java 代码,被翻译为下面的类似于汇编语言的指令 0 xxxx .... 2 xxxx .... 4 xx ... 5 xxx ... } 上面左边的 0、2、4、5

“线程安全”以上或以外

守給你的承諾、 提交于 2019-12-04 18:32:53
线程安全到底是什么意思? 现在的线程安全,流行的说法应该指的是保证类在多线程环境下的语义保持性。即:即使在多线程环境下,类的原始语义仍然得到保留。即,类不会在多线程环境下表现出跟单线程环境下一样的结果。 其实就是丢掉线程,类必须是安全的。类必须维持它的语义。为了达到这个语义,在多线程情况下需要作一些特殊处理,但是这种处理,能做的也仅仅如此:即保证类操作的语义。 因此,线程安全不是指你这么处理了,然后对象就安全了。不是这样的。是指相对于线程,它安全了。或者说,多线程本身并不足以扰乱它的步伐,或者它在多线程环境下仍然表现良好(表现出正确的语义提供能力)。 因此线程安全是一个相对于线程的概念,而不是安全的概念。它是一种相对安全,不是绝对安全。 比如,不管你怎么做同步,锁,到最后的数据安全仍然决定于最终的处理环境。 假设有十个调用层次,AND你在最终的层次也就是最顶层作了同步。但除非你的代码不向外发布,否则还是没有办法保证数据的安全。因为你不能保证你的调用者的行为。你的调用者,他可能这么干,做一下操作A,歇一下,然后做一下操作B,然后C,,依此类推。反正这样的调用不会在瞬间完成,所以你还是没有办法保证同步。 换句话说,同步就是个无止境的事情。线程安全解决不了它。即使你的类都只有一个操作,也还是解决不了这个问题。只要还存在组合状态或者说操作,数据安全的问题就不可能得到解决

jvm整理

前提是你 提交于 2019-12-04 18:05:16
我 2.JVM内存区域 /*--> */ /*--> */ /*--> */ /*--> */ JVM内存区域线程私有线程共享直接内存程序计数器虚拟机栈(VM Stack)本地方法栈方法区(永久代)Method Area类实例区(堆)与线程生命周期相同线程中,每调用一个方法就创建一个栈帧栈帧(Stack Frame)局部表量表操作数栈动态链接会出现的异常Out of MemoryStackOverflow异常Out of MemoryStack Overflow运行时常量池(Constant Pool)新生代(Young)老年代(Old)异常Out of Memory不受JVM GC管理执行Java方法执行Native方法记录字节码指令的地址(当前指令的地址)空返回地址Hotspot VM将其合二为一Eden区From Survivor区To Survivor区分代划分Hotspot VM中使用Java堆的永久代实现方法区分区MinorGC复制算法MajorGC标记清除算法元空间Meta Space类元数据字符串池类静态变量放在堆中 Created With MindMaster 来源: https://www.cnblogs.com/pipicai96/p/11876711.html

多线程之美1一volatile

社会主义新天地 提交于 2019-12-04 17:38:50
目录 一、java内存模型 1.1、抽象结构图 1.2、概念介绍 二、volatile详解 2.1、概念 2.2、保证内存可见性 2.3、不保证原子性 2.4、有序性 一、java内存模型 1.1、抽象结构图 1.2、概念介绍 java 内存模型 即Java memory model(简称JMM), java线程之间的通信由JMM控制,决定一个线程对共享变量的写入何时对另一个线程可见。 多线程通信通常分为2类:共享内存和消息传递 JMM采用的就是共享内存来实现线程间的通信,且通信是隐式的,对程序开发人员是透明的,所以在了解其原理了,才会对线程之间通信,同步,内存可见性问题有进一步认识,避免开发中出错。 线程之间如何通信? 在java中多个线程之间要想通信,如上图所示,每个线程在需要操作某个共享变量时,会将该主内存中这个共享变量拷贝一份副本存在在自己的本地内存(也叫工作内存,这里只是JMM的一个抽象概念,即将其笼统看做一片内存区域,用于每个线程存放变量,实际涉及到缓存,寄存器和其他硬件),线程操作这个副本,比如 int i = 1;一个线程想要进行 i++操作,会先将变量 i =1 的值先拷贝到自己本地内存操作,完成 i++,结果 i=2,此时主内存中的值还是1,在线程将结果刷新到主内存后,主内存值就更新为2,数据达到一致了。 如果线程A,线程B同时将 主内存中 i

面试-进程 线程 协程

旧巷老猫 提交于 2019-12-04 16:12:19
一、进程 进程的概念 1.进程是一个实体。每个进程都有自己的地址空间(CPU分配)。实体空间包括三部分: * 文本区域:存储处理器执行的代码。 * 数据区域:存储变量或进程执行期间使用的动态分配的内存。 * 堆栈:进程执行时调用的指令和本地变量。 2.进程是一个“执行中的程序”。 程序是指令与数据的有序集合,程序本身是没有生命的,只有CPU赋予程序生命时(CPU执行程序),它才能成为一个活动的实体,称为“进程”。 概括来说,进程就是一个具有独立功能的程序在某个数据集上的一次运行活动 进程的特点 * 动态性:进程是程序的一次执行过程,动态产生,动态消亡。 * 独立性:进程是一个能独立运行的基本单元。是系统分配资源与调度的基本单元。 * 并发性:任何进程都可以与其他进程并发执行。 二、并发与并行 并发:在操作系统中,某一时间段,几个程序在同一个CPU上运行,但在任意一个时间点上,只有一个程序在CPU上运行。 当有多个线程时,如果系统只有一个CPU,那么CPU不可能真正同时进行多个线程,CPU的运行时间会被划分成若干个时间段,每个时间段分配给各个线程去执行,一个时间段里某个线程运行时,其他线程处于挂起状态,这就是并发。并发解决了程序排队等待的问题,如果一个程序发生阻塞,其他程序仍然可以正常执行。 并行:当操作系统有多个CPU时,一个CPU处理A线程,另一个CPU处理B线程

小菜鸟之面试题下

社会主义新天地 提交于 2019-12-04 15:31:51
1 1 nio是什么?原理是什么?解决什么问题?如何实现? 2 nio是nonblocked io 非堵塞流 3 核心类有 Channel/Selector/Buffer 4 解决高并发情况下流的阻塞问题 5 6 2.IO/NIO的区别,为什么要用NIO,使用IO中的Buffered..也能实现NIO的面向缓冲,什么情况下用NIO? 7 io面向流/nio面向缓冲的 8 io是阻塞的/nio是非阻塞的 9 io没有选择器/nio有选择器 10 举例: 11 就是将100个客人的需求被登记区记录排序,然后让10个服务员(线程)到登记区(selector)领需求,完成后再返回领 需求,这样效率高 12 文件超大时候,使用nio缓冲区MappedByteBuffer,读写性能高,而且是异步的 13 14 15 3 什么是同步?什么是异步? 16 同步:程序的执行顺序和任务的排列顺序保持一致的,好比排队取餐 17 异步:程序的执行顺序和任务的排序顺序可以不一致,因为每个任务都有一个回调函数, 18 回调函数将原来的任务分担出一些功能,给原来的任务减负,程序执行任务耗时缩短 ,比如ajax技术 19 20 参考 21 22 http://blog.csdn.net/zhouhl_cn/article/details/6568119(比喻介绍IO/NIO的区别) 23 24 https:/

JAVA-LOCK之底层实现原理(源码分析)

[亡魂溺海] 提交于 2019-12-04 13:49:53
首先和Synchronized( 可以参考 ) 的不同之处,Lock完全用Java写成,在java这个层面是无关JVM实现的。其实现都依赖java.util.concurrent. AbstractQueuedSynchronizer 类,简称AQS。 简单说来,AbstractQueuedSynchronizer会把所有的请求线程构成一个CLH队列,当一个线程执行完毕(lock.unlock())时会激活自己的后继节点,但正在执行的线程并不在队列中,而那些等待执行的线程全部处于阻塞状态,经过调查线程的显式阻塞是通过调用LockSupport.park()完成,而LockSupport.park()则调用sun.misc.Unsafe.park()本地方法,再进一步,HotSpot在Linux中中通过调用pthread_mutex_lock函数把线程交给系统内核进行阻塞。 具体实现代码: 获取锁流程: 一、lock方法 final void lock() { if (compareAndSetState(0, 1)) setExclusiveOwnerThread(Thread.currentThread()); else acquire(1); } 对于刚来竞争的线程首先会通过CAS设置状态,如果设置成功那么直接获取锁,执行临界区的代码,反之调用acquire(1)进入同步队列中

jmeter接口测试(基础)

拟墨画扇 提交于 2019-12-04 13:33:30
一、jmeter创建请求 1.运行jmeter:jmeter.bat 2.右键测试计划,添加一个:线程组 3.右键前面添加的线程组,添加一个:http请求 4.填写请求信息: 5.右键线程组,添加监听器--查看结果树 6.jmeter第一次使用时,响应显示乱码,则在jmeter的bin目录下,找到jmeter.properties文件,把sampleresult.default.encoding设置成utf-8,然后重启jmeter即可 sampleresult.default.encoding=utf-8 二、jmeter设置断言 1.右键线程组-->断言-->响应断言 2.设置断言名称、选择测试字段:响应文本/响应代码……、模式匹配规则 3.添加测试模式,如: 完成!可以添加多个断言 三、jmeter数据参数化 1.右键线程组-->添加配设原件-->CSV数据文件设置 2.本地建一个txt文件,内容输出参数:比如注册需要填入账号名和密码 保存~ 3.jmeter点击CSV文件,导入本地文件:点击【浏览】 4.CSV参数设置:如下图 5.设置完毕,运行,就ok了~   来源: https://www.cnblogs.com/Qliupeng/p/11867937.html

线程和偏向锁、轻量级锁、重量级锁的知识整理

天大地大妈咪最大 提交于 2019-12-04 13:02:13
线程和偏向锁、轻量级锁、重量级锁的知识整理 https://www.cnblogs.com/xlecho/p/11342971.html xl_echo编辑整理,欢迎转载,转载请声明文章来源。欢迎添加echo微信(微信号:t2421499075)交流学习。 百战不败,依不自称常胜,百败不颓,依能奋力前行。——这才是真正的堪称强大!! 参考文章列表: Java并发编程:Synchronized底层优化(偏向锁、轻量级锁) 轻量级锁、偏向锁、重量级锁详情 偏向锁、轻量级锁、重量级锁、自旋锁原理讲解(推荐看一下) 参考视频:咕泡学院Mic老师的多线程基本原理 主要的内容如下 多线程同时执行的安全问题思考 Synchronized的基本认识 思考锁的存储 Synchronized锁的升级原理 wait/notify实现线程通信 多线程同时执行的安全问题思考 如果业务代码逻辑当中,有一个操作需要改变一个常量的值,比如int i = 0, 业务代码当中i需要i++。单线程的情况下,不会出现问题,如果是多线程并发操作i的值,这个时候,i的结果最终是什么?会出现线程的安全问题。这种情况应该怎么解决? 线程的安全性有三种 原子性 提供了互斥访问,同一时刻只能有一个线程对它进行操作 实现锁的两种方式: 1)synchronized:在作用对象的作用范围内,依赖JVM实现操作的原子性。 2)Lock

Java性能分析神器--VisualVM Launcher[1]

早过忘川 提交于 2019-12-04 11:39:51
Java性能分析神器1--VisualVM Launcher VisualVM 当你日复一日敲代码的时候,当你把各种各样的框架集成到一起的时候,看着大功告成成功运行的日志,有没有那么一丝丝迷茫和惆怅:这TM起的是什么玩意?每一行日志背后代表的是什么东西??他为什么就能跑起来了呢???? 这种时候不要慌,给大家推荐一款功能强大的插件:VisualVM Launcher。(eclipse就叫 VisualVM )。这个插件需要和客户端配合使用 VisualVM 。 VisualVM是集成了命令行JDK工具和轻量级分析功能的可视化工具。JVM提供了一些常用的jdk命令行工具: jstat(JVM Statistics Monitoring Tool):用于收集Hotspot虚拟机各方面的运行数据(查看虚拟机各云心状态信息),显示本地或远程虚拟机进程中的类装载,内存,垃圾收集, JIT编译等运行数据。 jps(JVM Process Status Tool):显示指定系统内所有的HotSpot虚拟机进程(查看虚拟机进程信息),可用于查询正在运行的虚拟机进程, 同时可选择性的显示虚拟机执行主类, 即执行main函数的类, 以及进程的本地虚拟机 ID(Local Virtual Machine Identifier 简称LVMID)(对于本地虚拟机进程来说,