本地线程

to meet you Java多线程与并发

家住魔仙堡 提交于 2020-03-14 18:46:59
2: hotspot中对象在内存的布局是分3部分 对象头 实例数据 对其填充 这里主要讲对象头:一般而言synchronized使用的锁对象是存储在对象头里的,对象头是由Mark Word和Class Metadata Address组成 mark word存储自身运行时数据,是实现轻量级锁和偏向锁的关键,默认存储对象的hasCode、分代年龄、锁类型、锁标志位等信息。 由于对象头的信息是与对象定义的数据没有关系的额外存储成本,所以考虑到jvm的空间效率,mark word 被设计出一个非固定的存储结构,以便存储更多有效的数据,它会根据对象本身的状态复用自己的存储空间(轻量级锁和偏向锁是java6后对synchronized优化后新增加的) Monitor:每个Java对象天生就自带了一把看不见的锁,它叫内部锁或者Monitor锁(监视器锁)。上图的重量级锁的指针指向的就是Monitor的起始地址。 每个对象都存在一个Monitor与之关联,对象与其Monitor之间的关系存在多种实现方式,如Monitor可以和对象一起创建销毁、或当线程获取对象锁时自动生成,当线程获取锁时Monitor处于锁定状态。 Monitor是虚拟机源码里面用C++实现的 源码解读:_WaitSet 和_EntryList就是之前学的等待池和锁池,_owner是指向持有Monitor对象的线程

Java 虚拟机的内存结构

蹲街弑〆低调 提交于 2020-03-13 05:38:33
Java虚拟机运行时数据区 整个程序执行过程中,JVM会用一段空间来存储程序执行期间需要用到的数据和相关信息,这段空间一般被称作为Runtime Data Area(运行时数据区),也就是我们常说的JVM内存。因此,在Java中我们常常说到的内存管理就是针对这段空间进行的管理(如何分配和回收内存空间)。 运行时数据区通常包括以下这几个部分: 程序计数器(Program Counter Register)   程序计数器(Program Count Register)是一块较小的内存空间,它可以看作是当前线程所执行的字节码的行号指示器。在虚拟机的概念模型里(仅是概念模型,各种虚拟机可能通过一些更高效的方式去实现),字节码解释器工作时就是通过改变这个计数器的值来选取下一条需要执行的字节码指令,分支,循环,跳转,异常处理,线程恢复等基础功能都需要依赖这个计数器来完成。   由于Java虚拟机的多线程是通过线程轮流切换并分配处理器执行时间的方式来实现的,在任何一个确定的时刻,一个处理器(对于多核处理器来说是一个内核)都只会执行一条线程中的指令。因此,为了线程切换后能恢复到正确的执行位置,每条线程都需要有一个独立的程序计数器,各条线程之间的计数器互不影响,独立存储,我们称这类内存区域为“线程私有”的内存。   如果线程正在执行的是一个Java方法

Java虚拟机--内存结构

筅森魡賤 提交于 2020-03-13 05:35:53
1.JVM是什么?    JVM:Java Virtual Mechinal(Java虚拟机).它是一个虚构的计算机,是通过在实际的计算机上模拟各种功能来实现的。JVM的主要工作是解释自己的指令集(字节码,如java源码编译成class文件在虚拟机上运行)并映射到本地的CPU指令集或OS的系统调用。Java语言跨平台的本质就是不同的操作系统使用不同的JVM映射规则,使其与操作系统无关,从而实现跨平台。 2.JVM的内存结构是什么样子?    Java虚拟机在运行Java程序的时候,会把它所管理的内存划分为若干个不同的数据区域,如图:        3.那么接下来每个数据区域都是做什么的呢?    (1).程序计数器: 是一块较小的内存空间,可以看作是当前线程所执行字节码的行号指示器。尤其在多线程的情况下,尤为重要。Java虚拟机的多线程是通过线程轮流切换并分配处理器执行时间的方式来实现的,即在任何一个确定时刻,一个处理器只会执行一条线程,当线程切换后就需要恢复到正确位置,因此,程序计数器要实现线程隔离,每个线程都有自己的专属的计数器。值得注意的是: 此内存区域是唯一一个在Java虚拟机规范中没有规定任何OutOfMemoryError情况的区域。    (2).堆 : 此内存区域是Java虚拟机管理的最大一块内存,同时也是线程共有的,在虚拟机启动时创建

java子线程中获取父线程的threadLocal中的值

妖精的绣舞 提交于 2020-03-11 12:48:24
我们都知道线程本地变量表也就是ThreadLocal在我们做线程级的数据隔离时非常好用,但是有时候我们会想如何让子线程获取到父线程的ThreadLocal,其实在线程中除了ThreadLocal外还有InheritableThreadLocal,顾名思义,可继承的线程变量表,可以让子线程获取到父线程中ThreadLocal的值。 public class BaseTest { public static final InheritableThreadLocal<String> inheritableThreadLocal = new InheritableThreadLocal<>(); public static final ThreadLocal<String> threadLocal = new ThreadLocal<>(); public static void main(String[] args) { inheritableThreadLocal.set("Inheritable hello"); threadLocal.set("hello"); new Thread(()->{ System.out.println(String.format("子线程可继承值:%s",inheritableThreadLocal.get())); System.out

C++11 原生标准多线程

空扰寡人 提交于 2020-03-11 10:06:20
之所以称之为C++11原生标准多线程,因为在C++中C++11版本才加入的多线程。所谓原生也就是C++语言自带的,区别于其他库实现,比如POSIX,Boost,winAPI,QT【藐视很少有人提到QT的多线程,不过我就是因为要使用QT的多线程库,才认真学习C++11原生标准多线程的。】等的多线程实现。关于系统学习C++原生多线程编程的书,我推荐由Anthony Williams所著的《Cpp Concurrency In Action》,中文版由陈晓伟所译。Anthony Williams是C++11多线程标准起草着之一。 《C++ Concurrency in Action》中文版 在线阅读可以访问陈晓伟的gitbook,他是免费开源的。 关于并发 《C++ Concurrency in Action》一书中对并发通俗的解释: 最简单和最基本的并发,是指两个或更多独立的活动同时发生。 并发在生活中随处可见,我们可以一边走路一边说话,也可以两只手同时作不同的动作,还有我们每个人都过着相互独立的生活——当我在游泳的时候,你可以看球赛,等等。 为什么使用并发 : 《C++ Concurrency in Action》中介绍的有点抽象,有点深奥。通俗的讲,就是 我们希望在相同的时间内做更多的事情: 把关注点(SOS)【我们要做的事情、任务】分离。还有就是 我们希望通过并发提高一下性能

进程、线程、协程之概念理解+线程和进程各自有什么区别和优劣

给你一囗甜甜゛ 提交于 2020-03-10 06:09:31
一、概念 首先,根据图了解一下串行,并行和并发的基本概念:   1、进程    资源分配的基本单位 进程(Process)是计算机中的程序关于某数据集合上的一次运行活动,是系统进行资源分配和调度的基本单位,是操作系统结构的基础。在早期面向进程设计的计算机结构中,进程是程序的基本执行实体;在当代面向线程设计的计算机结构中,进程是线程的容器。程序是指令、数据及其组织形式的描述,进程是程序的实体。 Linux系统函数fork()可在父进程中创建一个子进程,在父进程接到新请求时,复制出一个子进程来处理,即父进程监控请求,子进程处理,实现并发处理。注意:必须是Linux系统,windows不能用fork。 组成 进程是一个实体。每一个进程都有它自己的地址空间,一般情况下,包括文本区域(text region)、数据区域(data region)和堆栈(stack region)。文本区域存储处理器执行的代码;数据区域存储变量和进程执行期间使用的动态分配的内存;堆栈区域存储着活动过程调用的指令和本地变量。 特征 动态性:进程的实质是程序在多道程序系统中的一次执行过程,进程是动态产生,动态消亡的。 并发性:任何进程都可以同其他进程一起并发执行 独立性:进程是一个能独立运行的基本单位,同时也是系统分配资源和调度的独立单位; 异步性:由于进程间的相互制约,使进程具有执行的间断性,即进程按各自独立的

JVM内存结构学习

丶灬走出姿态 提交于 2020-03-09 08:08:03
JVM内存结构学习 简介 JVM载执行Java程序的过程中会把它所管理的内存划分为若干个不同的数据区域。 Java 虚拟机所管理的内存一共分为Method Area(方法区)、VM Stack(虚拟机栈)、Native Method Stack(本地方法栈)、Heap(堆)、Program Counter Register(程序计数器)五个区域。 这些区域都有各自的用途,以及创建和销毁的时间,有的区域随着虚拟机进程的启动而存在,有些区域则是依赖用户线程的启动和结束而建立和销毁。具体如下图所示: 上图介绍的是JDK1.8 JVM运行时内存数据区域划分。1.8同1.7比,最大的差别就是:元数据区取代了永久代。元空间的本质和永久代类似,都是对JVM规范中方法区的实现。不过元空间与永久代之间最大的区别在于:元数据空间并不在虚拟机中,而是使用本地内存。 程序计算器 、程序计数器(Program Counter Register)是一块较小的内存空间,可以看作是当前线程所执行的字节码的行号指示器。在虚拟机概念模型中,字节码解释器工作时就是通过改变计数器的值来选取下一条需要执行的字节码指令,分支、循环、跳转、异常处理、线程恢复等基础功能都需要依赖这个计数器来完成。 程序计数器是一块 “线程私有” 的内存,每条线程都有一个独立的程序计数器,能够将切换后的线程恢复到正确的执行位置。

Java基础教程:Java内存区域

拥有回忆 提交于 2020-03-09 05:28:41
Java基础教程:Java内存区域 运行时数据区域   Java虚拟机 在执行Java程序的过程种会把它所管理的内存划分为若干个不同的数据区域 。这些区域都有各自的用途,以及创建和销毁的时间,有的区域随着虚拟机进程的启动而存在,有些区域则依赖用户线程的启动和结束而建立和销毁。   根据《Java虚拟机规范》,Java虚拟机管理的内存将会包括以下几个运行时数据区域    程序计数器   程序技术器是一块较小的内存空间,可 视为当前线程所执行的字节码的行号计时器 。   在多线程开发中,为了线程切换后能恢复到正确的执行位置, 每条线程都需要有一个独立的程序技术器 ,各条线程之间的技术器互不影响,独立存储,我们称这类内存区域为“线程私有”的内存。   如果 当前线程执行的不是Java方法,而是Native方法,则这个计数器值为空。   该区域是唯一一个不存在OutOfMemoryError情况的区域。 Java虚拟机栈   同程序计时器一样,Java虚拟机栈也是线程私有的,他的生命周期与线程相同。虚拟机栈描述是Java方法执行的内存模型:每个方法在执行的同时都会创建一个栈帧用于存储局部变量表、操作数栈、动态链接、方法出口等信息。 每一个方法从调用直至执行完成的过程,就对应着一个栈帧在虚拟机栈中入栈到出栈的过程 。 TIPS: 我们常把内存划分为堆和栈,其中栈就是指的Java虚拟机栈

01.HTML5的新标签

人盡茶涼 提交于 2020-03-09 04:47:34
H5 新特性 1.语义化标签:header、footer、section、nav、aside、article 2.增强型表单:input 的多个 type 3.新增表单元素:datalist、keygen、output 4.新增表单属性:placehoder、required、min 和 max 5.音频视频:audio、video 6.canvas 7地理定位 8.拖拽 9.本地存储:localStorage - 没有时间限制的数据存储;sessionStorage - 针对一个 session 的数据存储,当用户关闭浏览器窗口后,数据会被删除 10.新事件:onresize、ondrag、onscroll、onmousewheel、onerror、onplay、onpause 11.WebSocket:单个 TCP 连接上进行全双工通讯的协议 1.语义化标签 注意:标签语义化的好处? 1)即使没有CSS的情况下,也能看出代码的结构 2)有利于其他的设备更好的解析 3)有利于SEO(Search Engine Optimization利用搜索引擎规则提高排名),利于爬虫抓取有用的信息 4)便于开发人员后期维护 2.增强型表单 HTML5 拥有多个新的表单 Input 输入类型。这些新特性提供了更好的输入控制和验证 html5 也新增以下表单元素 3.html5 新增的表单属性 4

JVM内存模型

我的梦境 提交于 2020-03-09 01:01:39
JVM的内存划分: 方法区: 是线程共享的,常量静态变量的JIT(即时编译器)编译后代码也在方法区存放。用来 存储已被虚拟机加载的类信息,常量,静态变量,即时编译器编译后的代码等数据。 虽然Java虚拟机规范把方法区描述为堆得一个逻辑部分,但是他却有个别名Non-Heap(非堆),目的是为了与Java堆区分。 堆内存: 是 线程共享的,垃圾回收的主要场所 。Java虚拟机所管理的 内存最大的一块 ,在 虚拟机启动时创建。 此内存区域的 唯一目的就是存放对象实例 (也就是new出来的),几乎所有的对象实例以及数组都在这里分配。Java堆是垃圾收集管理器的主要区域,因此也被称作GC堆。 程序计数器: 当前线程执行的字节码的位置指示器。是一块较小的内存空间,可以看做是 当前线程所执行的符号指示器。 两个主要作用: 字节码解释器通过改变程序计数器来一次读取指令,从而实现代码的流程控制,如:顺序执行,选择,循环,异常处理。 在多线程的情况下,程序计数器用于记录当前程序执行的位置,从而当线程被切换回来的时候能够知道该线程上次运行的位置。 注意: 程序计数器是 唯一一个不会出现OutOfMemoryError的内存区域 ,他的生命周期随着现成的创建而创建,随着线程的结束而死亡。 Java虚拟机(栈内存): 保存局部变量,基本数据类型以及堆内存中对象的引用变量。是线程私有的