本地线程

java虚拟机

為{幸葍}努か 提交于 2020-03-07 10:54:21
1.java虚拟机的生命周期 当启动一个java程序时,一个虚拟机实例也就生成了,当该程序关闭退出,这个虚拟机实例也就随之消亡。 java虚拟机内部有两种线程 ,守护线程和非守护线程,守护线程是执行垃圾收集的线程,而java程序中的初始线程-就是开始于main()方法的那个,是非守护线程。当该程序中的所有非守护线程都终止时,虚拟机实例将自动退出。 2.java虚拟机的体系结构 类装载子系统,执行引擎,运行时数据区 (方法区,堆,java栈,pc寄存器,本地方法栈)。每个java虚拟机实例都有一个方法区以及一个堆,它是所有线程共享的。当虚拟机装载一个class文件时,它会从这个class文件包含的二进制数据中解析类型信息,然后把类型信息放到方法区中,堆里面放的是对象。 当一个新线程被创建时,它将得到它自己的pc寄存器(程序计数器)以及一个java栈,pc寄存器的值总是指示下一条将被执行的指令,而它的java栈则总是存储该线程中java方法的调用状态(包括局部变量,被调用时传进来的参数,它的返回值,以及运算的中间结果)。 3.类装载器子系统 java虚拟机有两种类装载器 :启动类装载器和用户自定义类装载器, 4.方法区   类的类型信息,类型的常量池,字段信息,方法信息,除了常量以外的所有类变量,一个到类classLoader的引用,一个到class类的引用    a。常量池    

jvm学习006 jvm内存结构分配

穿精又带淫゛_ 提交于 2020-03-07 06:13:10
主要内容如下: JVM启动流程 JVM基本结构 内存模型 编译和解释运行的概念 一、JVM启动流程: JVM启动时,是由java命令/javaw命令来启动的。 二、JVM基本结构: JVM基本结构图: 《深入理解Java虚拟机(第二版)》中的描述是下面这个样子的: Java中的内存分配: Java程序在运行时,需要在内存中的分配空间。 为了提高运算效率,就对数据进行了不同空间的划分 ,因为每一片区域都有特定的处理数据方式和内存管理方式。 具体划分为如下 5个内存空间 :(非常重要) 栈 :存放 局部变量 堆 :存放所有 new出来的东西 方法区:被虚拟机加载的类信息、常量、静态常量等。 程序计数器(和系统相关) 本地方法栈 1、程序计数器: 每个线程拥有一个PC寄存器 在线程创建时创建 指向下一条指令的地址 执行本地方法时,PC的值为undefined 2、方法区: 保存装载的类信息   类型的常量池   字段,方法信息   方法字节码 通常和永久区(Perm)关联在一起 3、堆内存: 和程序开发密切相关 应用系统对象都保存在Java堆中 所有线程共享Java堆 对分代GC来说,堆也是分代的 GC管理的主要区域 现在的GC基本都采用分代收集算法,如果是分代的,那么堆也是分代的。如果堆是分代的,那堆空间应该是下面这个样子: 上图是堆的基本结构,在之后的文章中再进行详解。 4、栈内存:

并发设计模式1-避免共享

假如想象 提交于 2020-03-07 02:24:59
并发问题产生条件:多个线程同时对共享变量进行读写操作。 解决并发问题,我们平时都是加互斥锁,防止同时进行读写操作,其实换个角度想, 避免共享 ,就可以了。 接下来介绍三种避免共享的三种模式: Immutability 模式、Copy-on-Write 模式和线程本地存储模式。 Immutability 模式(不变性模式) 该模式解决并发问题的思路就是让共享变量只有读操作,没有写操作。即,不变性,**就是创建对象之后,状态就不再发生变化。**变量一旦赋值就不允许赋值。 如何实现不可变性的类? 将所有的属性都设置成final; 只允许存在只读方法; 如果类的属性是引用型,该属性对应的对象也应该是不可变对象。 不可变对象的应用 其实JAVA SDK中很多类都具备不可变性,比如经常用到的基本类型的包装类Integer,String,Long,Double等,内部都实现了不可变性,其属性都是final类型的,但是你会发现一个问题, 这些类中有存在修改的方法,比如String.replace方法 ,这是怎么回事呢? String replace ( char oldChar , char newChar ) { 。。。。省略 //创建一个新的字符串返回 //原字符串不会发生任何变化 return new String ( buf , true ) ; } 它是创建了新的String对象返回

ThreadLocal

不羁的心 提交于 2020-03-06 09:05:00
所属包 : java.lang; 描述 : ThreadLocal类提了供线程本地变量。它与普通变量的区别在于,每个使用该变量的线程都会初始化一个完全独立的副本。ThreadLocal 变量通常被private static修饰,用于关联线程上下文。 错误的理解 : ThreadLocal为解决多线程程序的并发问题提供了一种新的思路 ;ThreadLocal的目的是为了解决多线程访问资源时的共享问题; 解决的问题 : ThreadLocal提供了线程本地变量,每个线程都有一个该变量的副本,这种变量在线程的生命周期内起作用,减少同一个线程内多个函数或者组件之间一些公共变量的传递的复杂度 应用场景 : 当一个变量需要在线程间隔离而在方法或类间共享时,可以使用ThreadLocal ; 案例 :利用ThreadLocal设计一个 懒汉式的单例模式 线程上下文工具类,应用场景:线程上下文传参 public class ThreadContextUtil { private static ThreadLocal < Map < String , Object > > threadContext = new ThreadLocal < Map < String , Object > > ( ) ; private static volatile ThreadContextUtil

JVM 内存结构模型

南楼画角 提交于 2020-03-04 03:32:44
文章目录 JVM 内存结构模型 JVM 内存区域 程序计数器 PC 虚拟机栈 本地方法栈 堆 方法区 运行时常量池 JAVA8 与元空间 执行引擎 JVM 内存结构模型 JVM 虚拟机主要由 4 个部分组成: Class Loader: 依据特定的格式,将 class 文件加载到内存 Execution Engine: 解析字节码文件并提交给操作系统执行 Native Interface: Java 本地接口,融合不同语言开发的原生库为 Java 所用 Runtime Data Area: JVM 内存结构模型 JVM 内存区域 线程私有 程序计数器 PC、虚拟机栈、本地方法栈 线程共享 方法区、堆、直接内存(非运行时数据区) 线程私有数据区域生命周期与线程相同, 依赖用户线程的启动/结束 而 创建/销毁(在 Hotspot VM 内) ,每个线程都与操作系统的本地线程直接映射, 因此这部分内存区域的存/否跟随本地线程的生/死对应)。 线程共享区域随虚拟机的启动/关闭而创建/销毁 直接内存并不是 JVM 运行时数据区的一部分 ,但也会被频繁的使用:在 JDK 1.4 引入的 NIO 提供了基于 Channel 与 Buffer 的 IO 方式,它可以使用 Native 函数库直接分配堆外内存,然后使用 DirectByteBuffer 对象作为这块内存的引用进行操作,这样就避免了在

java中volatile关键字的含义

牧云@^-^@ 提交于 2020-03-03 18:55:51
转自:http://www.cnblogs.com/aigongsi/archive/2012/04/01/2429166.html 在java线程并发处理中,有一个关键字volatile的使用目前存在很大的混淆,以为使用这个关键字,在进行多线程并发处理的时候就可以万事大吉。 Java语言是支持多线程的,为了解决线程并发的问题,在语言内部引入了 同步块 和 volatile 关键字机制。 synchronized 同步块大家都比较熟悉,通过 synchronized 关键字来实现,所有加上synchronized 和 块语句,在多线程访问的时候,同一时刻只能有一个线程能够用 synchronized 修饰的方法 或者 代码块。 volatile 用volatile修饰的变量,线程在每次使用变量的时候,都会读取变量修改后的最的值。volatile很容易被误用,用来进行原子性操作。 下面看一个例子,我们实现一个计数器,每次线程启动的时候,会调用计数器inc方法,对计数器进行加一 执行环境——jdk版本:jdk1.6.0_31 ,内存 :3G cpu:x86 2.4G public class Counter { public static int count = 0; public static void inc() { //这里延迟1毫秒,使得结果明显 try { Thread

Java面试全解析(22)ThreadLocal 有什么用

浪尽此生 提交于 2020-03-03 15:24:09
什么是 ThreadLocal? ThreadLocal 诞生于 JDK 1.2,用于解决多线程间的数据隔离问题。也就是说 ThreadLocal 会为每一个线程创建一个单独的变量副本。 ThreadLocal 有什么用? ThreadLocal 最典型的使用场景有两个: ThreadLocal 可以用来管理 Session,因为每个人的信息都是不一样的,所以就很适合用 ThreadLocal 来管理; 数据库连接,为每一个线程分配一个独立的资源,也适合用 ThreadLocal 来实现。 其中,ThreadLocal 也被用在很多大型开源框架中,比如 Spring 的事务管理器,还有 Hibernate 的 Session 管理等,既然 ThreadLocal 用途如此广泛,那接下来就让我们共同看看 ThreadLocal 要怎么用?ThreadLocal 使用中要注意什么?以及 ThreadLocal 的存储原理等,一起来看吧。 ThreadLocal 基础使用 ThreadLocal 常用方法有 set(T)、get()、remove() 等,具体使用请参考以下代码。 ThreadLocal threadLocal = new ThreadLocal(); // 存值 threadLocal.set(Arrays.asList( "老王" , "Java 面试题" )); /

java中sleep与wait方法研究探讨

蹲街弑〆低调 提交于 2020-03-02 02:13:57
1.sleep与wait方法的区别 这个在面试题目中经常出现,比较全的答案如下: a.sleep是Thread的静态方法,可以睡眠当前调用者进程,而wait是Object里面的方法。 b.sleep不释放锁,而wait释放锁,使得其他线程可以使用同步方法或者同步控制块(**但是注意sleep和wait都释放出cpu的使用权**)。 c.wait,notify和notifyAll只能在同步控制方法或者同步控制块里面使用,而sleep可以在任何地方使用(使用范围)  synchronized(x){ x.notify() //或者wait() } d.sleep方法要处理异常,而wait不用处理异常。 其实最本质的区别的sleep不释放锁,而wait释放锁。示例: public class TestSynchronized { public void test1() { synchronized(this) { int i = 5; while( i-- > 0) { System.out.println(Thread.currentThread().getName() + " : " + i); try { Thread.sleep(500); //sleep并不释放对象锁 } catch (InterruptedException ie) { } } } } public

疫情之下,我帮你总结了全网最全的Java面试高频考点

血红的双手。 提交于 2020-03-01 23:04:40
2020,结尾猜不到,开头也没料到会这么难!复工难,各种延期!连跳槽涨薪计划都得跟着调整。一个明显的感受:开春全都是 “云上” 面试,到底怎么搞呢? 的确,面试形式的变化带来了更有难度的面试筛选环节,无论是一面还是二面,都很考验平时的技术沉淀。 疫情期间,我搜集了 N 套阿里、腾讯、美团、网易等公司的面试题,把技术点梳理成一份大而全的“Java 架构面试”笔记(实际上比预期多花了不少精力),包含知识脉络 + 分支细节,由于篇幅有限,这里以图片的形式给大家展示一部分。 这份资料尤其适合: 1.近期想跳槽,要面试的Java程序员,查漏补缺,以便尽快弥补短板; 2.想了解“一线互联网公司”最新技术要求,对比找出自身的长处和弱点所在,评估自己在现有市场上的竞争力如何; 3.做了几年Java开发,但还没形成系统的Java知识体系,缺乏清晰的提升方向和学习路径的程序员。 相信它会给大家带来很多收获。 PS:文章篇幅有限,为了不影响观赏性,大厂面试题的答案及详解,直接 点我 即可获取~ 阿里Java岗:多线程、集合、JVM、分布式、Spring、Mybatis、Linux及常用数据库、ES等 一、多线程 JAVA并发知识库 JAVA线程实现/创建方式 4种线程池 线程生命周期(状态) 终止线程4种方式 sleep与wait 区别 start与run区别 JAVA后台线程 JAVA锁 线程基本方法

Java并发编程:深入剖析ThreadLocal

我怕爱的太早我们不能终老 提交于 2020-03-01 10:34:29
个人博客导航页(点击 右侧 链接 即可打开个人博客): 大牛带你入门技术栈 想必很多朋友对ThreadLocal并不陌生,今天我们就来一起探讨下ThreadLocal的使用方法和实现原理。首先,本文先谈一下对ThreadLocal的理解,然后根据ThreadLocal类的源码分析了其实现原理和使用需要注意的地方,最后给出了两个应用场景。   以下是本文目录大纲:   一.对ThreadLocal的理解   二.深入解析ThreadLocal类   三.ThreadLocal的应用场景   若有不正之处请多多谅解,并欢迎批评指正。   请尊重作者劳动成果,转载请标明原文链接:    http://www.cnblogs.com/dolphin0520/p/3920407.html 一.对ThreadLocal的理解 ThreadLocal,很多地方叫做线程本地变量,也有些地方叫做线程本地存储,其实意思差不多。可能很多朋友都知道ThreadLocal为变量在每个线程中都创建了一个副本,那么每个线程可以访问自己内部的副本变量。   这句话从字面上看起来很容易理解,但是真正理解并不是那么容易。   我们还是先来看一个例子: class ConnectionManager { private static Connection connect = null; public static