本地线程

Java synchronized 关键字的实现原理

╄→尐↘猪︶ㄣ 提交于 2020-03-29 11:14:29
数据同步需要依赖锁,那锁的同步又依赖谁?synchronized给出的答案是在软件层面依赖JVM,而Lock给出的方案是在硬件层面依赖特殊的CPU指令,大家可能会进一步追问:JVM底层又是如何实现synchronized的? 本文所指说的JVM是指Hotspot的6u23版本,下面首先介绍synchronized的实现: synrhronized关键字简洁、清晰、语义明确,因此即使有了Lock接口,使用的还是非常广泛。其应用层的语义是可以把任何一个非null 对象 作为"锁",当synchronized作用在方法上时,锁住的便是对象实例(this);当作用在静态方法时锁住的便是对象对应的Class实例,因为 Class数据存在于永久带,因此静态方法锁相当于该类的一个全局锁;当synchronized作用于某一个对象实例时,锁住的便是对应的代码块。在 HotSpot JVM实现中,锁有个专门的名字:对象监视器。 1. 线程状态及状态转换 当多个线程同时请求某个对象监视器时,对象监视器会设置几种状态用来区分请求的线程: Contention List:所有请求锁的线程将被首先放置到该竞争队列 Entry List:Contention List中那些有资格成为候选人的线程被移到Entry List Wait Set:那些调用wait方法被阻塞的线程被放置到Wait Set OnDeck

第十三周学习报告

拟墨画扇 提交于 2020-03-28 15:26:37
第十三周(11.30-12.06): 一、学习目标 1. 掌握三种并发的方式:进程、线程、I/O多路复用 2. 掌握线程控制及相关系统调用 3. 掌握线程同步互斥及相关系统调用 二、学习资源 1. 教材:第十一章《网络编程》简单过一下 2. 教材:第十二章《并发编程》 并发编程 如果逻辑控制流在时间上重叠,那么他们就是并发的,这种常见的现象叫做并发。 并发不限制于内核: 访问慢速I/O 设备 与人交互 通过推迟工作以降低延迟 服务多个网络客户端 在多核机器上进行并发计算 进程 I/O多路复用 线程 12.1基于进程的并发编程 第一步:服务器接受客户端的连接请求 第二步:服务器派生一个子进程为这个客服端服务 第三步:服务器接受另一个连接请求 第四步:服务器派生另一个子进程为新的客户端服务 12.1.2关于进程的优劣 模型:共享文件表,但是不共享用户地址空间 独立的地址空间使得进程共享状态信息变得更加困难 基于I/O多路复用的并发编程 对于两个事件: 网络客户端发起的连接请求 用户在键盘上输入命令行 针对不知道等待哪个事件,一个解决办法就是I/O多路复用技术。 基本思路就是使用select函数,要求内核挂起进程,只有在一个或者多个I/O事件发生后,才将控制返回给应用程序,就像P651事例一样: 当集合{0,4}中任意描述符准备好读时返回。 当集合{1,2,7}中任意描述符准备好写时返回

Java多线程-入门知识

让人想犯罪 __ 提交于 2020-03-28 13:49:23
通用知识-名词解释 多任务:统一时间可以运行多个任务(应用程序),但存在并发(同一个CPU上)于并行(多个CPU同时处理)的区别. 进程:进程是线程的容器。是包含程序的指令、数据及其组织形式的描述,进程是程序的实体,保持着当前程序的活动状态。 线程:一条线程指的是进程中一个单一顺序的执行线,也是操作系统能够进行运算调度的最小单位,可共享进程的所有资源,也有自己的调用栈(call stack),寄存器环境(register context),线程本地存储(thread-local storage). 多线程:在一个进程中存在多条线程,同时执行抢夺CPU执行权. 线程的生命周期:一条线程从创建到死亡的过程,一般是1-10级. 线程优先级:设置线程优先级只能说明应该被优先执行,而不是一定是优先执行. Java知识-名词解释 Java进程: 一个Java进程等于一个JVM进程. java线程:main函数就是一条线程的入口,也称为主线程. Java线程生命周期: 来源: https://www.cnblogs.com/laxilo/p/12586886.html

tensorflow中协调器 tf.train.Coordinator 和入队线程启动器 tf.train.start_queue_runners

故事扮演 提交于 2020-03-27 21:28:50
TensorFlow的Session对象是支持多线程的,可以在同一个会话(Session)中创建多个线程,并行执行。在Session中的所有线程都必须能被同步终止,异常必须能被正确捕获并报告,会话终止的时候, 队列必须能被正确地关闭。 TensorFlow提供了两个类来实现对Session中多线程的管理:tf.Coordinator和 tf.QueueRunner,这两个类往往一起使用。 Coordinator类用来管理在Session中的多个线程,可以用来同时停止多个工作线程并且向那个在等待所有工作线程终止的程序报告异常,该线程捕获到这个异常之后就会终止所有线程。 使用 tf.train.Coordinator()来创建一个线程管理器(协调器)对象 。 QueueRunner类用来启动tensor的入队线程,可以用来启动多个工作线程同时将多个tensor(训练数据)推送入文件名称队列中,具体执行函数是 tf.train.start_queue_runners , 只有调用 tf.train.start_queue_runners 之后,才会真正把tensor推入内存序列中,供计算单元调用,否则会由于内存序列为空,数据流图会处于一直等待状态 。 tf中的数据读取机制如下图: 调用 tf.train.slice_input_producer,从 本地文件里抽取tensor

面试刷题16:synchronized和ReentrantLock的区别?

こ雲淡風輕ζ 提交于 2020-03-27 20:23:48
java并发编程是程序员基本技能。 我是李福春,我在准备面试,今天的题目是: synchronized和ReentrantLock的区别? 这两货都是java提供的同步机制,提供了互斥语义和可见性,当一个线程获得资源之后,其它竞争资源的线程必须等待或者堵塞。 区别如下: 线程安全 线程安全说的是多线程场景下,共享可修改状的数据的正确性。 从语义来看,保证线程安全的方法有2: 1, 封装起来,数据不共享,私有化。 2, 数据不可修改,自然不存在线程不安全。final,immutable; 线程安全的3个特性: 隔离性: 相关操作不会被其它线程干扰 顺序性: 线程内的串行语义,避免指令重排; 可见性: 线程的本地变量修改应该反馈到主内存上,使用volatile关键字。 先来看一个线程不安全的例子: package org.example.mianshi.concurrent; /** * 线程不安全例子,共享数据sharedState * @author lifuchun */ public class ThreadSafeSample { public int sharedState; public void nonSafeAction() { while (sharedState < 100000) { int former = sharedState++; int latter

面试刷题16:synchronized和ReentrantLock的区别?

你说的曾经没有我的故事 提交于 2020-03-27 19:16:50
3 月,跳不动了?>>> <br /> <br /> <br />java并发编程是程序员基本技能。<br /> <br />我是李福春,我在准备面试,今天的题目是:<br /> <br />synchronized和ReentrantLock的区别?<br /> <br />这两货都是java提供的同步机制,提供了互斥语义和可见性,当一个线程获得资源之后,其它竞争资源的线程必须等待或者堵塞。<br /> <br />区别如下:<br /> <br /> <br /> <br /> 线程安全 <br /> <br />线程安全说的是多线程场景下,共享可修改状的数据的正确性。<br /> <br />从语义来看,保证线程安全的方法有2:<br />1, 封装起来,数据不共享,私有化。<br />2, 数据不可修改,自然不存在线程不安全。final,immutable;<br /> <br />线程安全的3个特性:<br />隔离性: 相关操作不会被其它线程干扰<br />顺序性: 线程内的串行语义,避免指令重排;<br />可见性: 线程的本地变量修改应该反馈到主内存上,使用volatile关键字。<br /> <br /> <br />先来看一个线程不安全的例子:<br /> package org.example.mianshi.concurrent; /** * 线程不安全例子

JVM史上最最最完整深入解析(12000字噢)

空扰寡人 提交于 2020-03-27 18:12:07
3 月,跳不动了?>>> 点点这个链接免费获取: 【推荐】2020年最新Java电子书集合.pdf(吐血整理) >>> 工作之余,总结一下JVM相关知识。 Java运行时数据区: Java虚拟机在执行Java程序的过程中会将其管理的内存划分为若干个不同的数据区域,这些区域有各自的用途、创建和销毁的时间,有些区域随虚拟机进程的启动而存在,有些区域则是依赖用户线程的启动和结束来建立和销毁。Java虚拟机所管理的内存包括以下几个运行时数据区域,如图: 1、程序计数器:指向当前线程正在执行的字节码指令。线程私有的。 2、虚拟机栈:虚拟机栈是Java执行方法的内存模型。每个方法被执行的时候,都会创建一个栈帧,把栈帧压人栈,当方法正常返回或者抛出未捕获的异常时,栈帧就会出栈。(1)栈帧:栈帧存储方法的相关信息,包含局部变量数表、返回值、操作数栈、动态链接a、局部变量表:包含了方法执行过程中的所有变量。局部变量数组所需要的空间在编译期间完成分配,在方法运行期间不会改变局部变量数组的大小。b、返回值:如果有返回值的话,压入调用者栈帧中的操作数栈中,并且把PC的值指向 方法调用指令 后面的一条指令地址。c、操作数栈:操作变量的内存模型。操作数栈的最大深度在编译的时候已经确定(写入方法区code属性的max_stacks项中)。操作数栈的的元素可以是任意Java类型,包括long和double

Java内存模型

廉价感情. 提交于 2020-03-27 08:38:11
Java虚拟机规范中将Java运行时数据分为六种。 1.程序计数器:是一个数据结构,用于保存当前正常执行的程序的内存地址。Java虚拟机的多线程就是通过线程轮流切换并分配处理器时间来实现的,为了线程切换后能恢复到正确的位置,每条线程都需要一个独立的程序计数器,互不影响,该区域为“线程私有”。 2.Java虚拟机栈:线程私有的,与线程生命周期相同,用于存储局部变量表,操作栈,方法返回值。局部变量表放着基本数据类型,还有对象的引用。 3.本地方法栈:跟虚拟机栈很像,不过它是为虚拟机使用到的Native方法服务。 4.Java堆:所有线程共享的一块内存区域,对象实例几乎都在这分配内存。 5.方法区:各个线程共享的区域,储存虚拟机加载的类信息,常量,静态变量,编译后的代码。 6.运行时常量池:代表运行时每个class文件中的常量表。包括几种常量:编译时的数字常量、方法或者域的引用。 友情链接: Java中JVM虚拟机详解 来源: https://www.cnblogs.com/lxmyhappy/p/6761756.html

JVM内存

巧了我就是萌 提交于 2020-03-27 08:34:27
Java内存模型: Java虚拟机规范中将Java运行时数据分为六种。 1.程序计数器:是一个数据结构,用于保存当前正常执行的程序的内存地址。Java虚拟机的多线程就是通过线程轮流切换并分配处理器时间来实现的,为了线程切换后能恢复到正确的位置,每条线程都需要一个独立的程序计数器,互不影响,该区域为“线程私有”。 2.Java虚拟机栈:线程私有的,与线程生命周期相同,用于存储局部变量表,操作栈,方法返回值。局部变量表放着基本数据类型,还有对象的引用。 3.本地方法栈:跟虚拟机栈很像,不过它是为虚拟机使用到的Native方法服务。 4.Java堆:所有线程共享的一块内存区域,对象实例几乎都在这分配内存。 5.方法区:各个线程共享的区域,储存虚拟机加载的类信息,常量,静态变量,编译后的代码。 6.运行时常量池:代表运行时每个class文件中的常量表。包括几种常量:编译时的数字常量、方法或者域的引用。 来源: https://www.cnblogs.com/ng-xixi/p/9942099.html

JVM结构、GC工作机制详解

喜你入骨 提交于 2020-03-26 20:06:48
版权声明:本文为博主原创文章,未经博主允许不得转载。 目录 (?) [+] 题外话:最近在应聘阿里2015暑期实习,感触颇多。机会总是留给有准备的人的,所以平常一定要注意知识的巩固和积累。知识的深度也要有一定的理解,不比别人知道的多,公司干嘛选你?关于JVM和GC,我相信学 Java 的绝大部分人都听过,很多公司的面试官都爱问,一开始我也很头痛,问这么底层干什么,所以我每次面试也只是看看答案敷衍了事。最近面完阿里感觉真不能这样,知识不仅要知其然,还要知其所以然。其实弄懂了JVM和GC,对我们理解很多java知识都有帮助。网上有很多关于GC和JVM的文章,这篇博文主要是根据我最近看《深入理解Java虚拟机》的一些体会总结出来的,希望对新手有些帮助,也欢迎大牛拍砖。文章主要分为以下四个部分 JVM结构、内存分配、垃圾回收 算法 、垃圾收集器 。下面我们一一来看。 一、JVM结构 根据《java虚拟机规范》规定,JVM的基本结构一般如下图所示: 从左图可知,JVM主要包括四个部分: 1.类加载器(ClassLoader) :在JVM启动时或者在类运行时将需要的class加载到JVM中。(右图表示了从java源文件到JVM的整个过程,可配合理解。 关于类的加载机制,可以参考 http://blog.csdn.net/tonytfjing/article/details/47212291 )