本地线程

JVM的并发问题

你说的曾经没有我的故事 提交于 2020-02-26 15:18:34
Java内存模型 1.程序,进程,线程的基本概念?   1.程序:是指完成某一项任务的代码序列(静态的概念)   2.进程:程序在某些数据上的一次运行(动态概念)   3.线程:一个进程可能包含一个或者多个线程(占有资源的独立单元) 2.JVM的内存区域?         JVM内存模型 VMstack    1.方法区: 主要存储类信息(通过classLoader:类加载器加载进来的),常量信息,使用static关键字修饰的属性,方法,代码块 等。当使用反射原理进行类加载时其实就是调用的方法区的数据。( 信息共享 )    2.Java堆区: 主要存放实例对象,当使用new关键字创建一个对象的时候,就会把相关信息放在堆区域,所以这也是GC活动的主要区域,同时也是发生OOM(内存溢出)的主要区域。( 信息共享 )    3.VMstack(虚拟机栈): Java方法运行的内存模型,在VMstack中,每一个方法都有唯一的一个栈帧与之对应,存放这个方法的一些私有信息,比如:局部变量,引用类型数据的地址,操作数栈等...。因为是存储一个方法的信息,所有 不能实现数据共享 ,是 私有 的。    4.PC(程序计数器): 是Java的私有数据,这个数据就是执行下一条指令的地址。( 私有的 )    5.Native method stack(本地方法栈): 与JVM的native。(

Java线程面试题 Top 50 (转载)

Deadly 提交于 2020-02-26 10:06:30
 本文由 ImportNew - 李 广 翻译自 javarevisited 。欢迎加入 Java小组 。转载请参见文章末尾的要求。   不管你是新程序员还是老手,你一定在面试中遇到过有关线程的问题。Java语言一个重要的特点就是内置了对并发的支持,让Java大受企业和程序员的欢迎。大多数待遇丰厚的Java开发职位都要求开发者精通多线程技术并且有丰富的Java程序开发、调试、优化经验,所以线程相关的问题在面试中经常会被提到。   在典型的Java面试中, 面试官会从线程的基本概念问起, 如:为什么你需要使用线程, 如何创建线程,用什么方式创建线程比较好(比如: 继承thread类还是调用Runnable接口 ),然后逐渐问到并发问题像在Java并发编程的过程中遇到了什么挑战,Java内存模型,JDK1.5引入了哪些更高阶的并发工具,并发编程常用的 设计模式 ,经典多线程问题如生产者消费者,哲学家就餐,读写器或者简单的有界缓冲区问题。仅仅知道线程的基本概念是远远不够的, 你必须知道如何处理 死锁 , 竞态条件 ,内存冲突和线程安全等并发问题。掌握了这些技巧,你就可以轻松应对多线程和并发面试了。   许多Java程序员在面试前才会去看面试题,这很正常。因为收集面试题和练习很花时间,所以我从许多面试者那里收集了Java多线程和并发相关的50个热门问题

OOM以及垃圾收集器

点点圈 提交于 2020-02-26 10:06:15
1.常见的几种OOM? ①java.lang.StackOverflowError②java.lang.OutOfMemoryError:Java heap space③java.lang.OutOfMemoryError:GC overhead limit exceeded④java.lang.OutOfMemoryError:Direct buffer memory⑤java.lang.OutOfMemoryError:unable to create new native thread⑥java.lang.OutOfMemoryError:Metaspace /** * 描述:GC overhead Limit * jvm参数配置演示:-Xms10m -Xmx10m -XX:+PrintGCDetails -XX:+MaxDirectMemorySize=5m * GC回收时间过长会抛出OutOfMemroyError,过长的定义是,超过98%的时间来做GC并且只回收了不到2%的堆内存 * 连续多次GC都只是回收了不到2%的极端情况下才会抛出,假如不抛出GC Overhead limit错误会发生什么呢? * CPU使用率一直是100%,而GC没有任何成功 * * @author xinjiao.yu@marketin.cn * @create 2020/2/24 21:41

🔥史上最全的Java并发系列之Java并发机制的底层实现原理

社会主义新天地 提交于 2020-02-26 05:10:55
并发编程的3个基本概念 原子性 定义: 即一个操作或者多个操作 要么全部执行并且执行的过程不会被任何因素打断,要么就都不执行。 原子性是拒绝多线程操作的,不论是多核还是单核,具有原子性的量,同一时刻只能有一个线程来对它进行操作。简而言之,在整个操作过程中不会被线程调度器中断的操作,都可认为是原子性。例如 a=1是原子性操作,但是a++和a +=1就不是原子性操作。Java中的原子性操作包括: a. 基本类型的读取和赋值操作,且赋值必须是数字赋值给变量,变量之间的相互赋值不是原子性操作。 b.所有引用reference的赋值操作 c.java.concurrent.Atomic.* 包中所有类的一切操作 可见性 定义:指当多个线程访问同一个变量时,一个线程修改了这个变量的值,其他线程能够立即看得到修改的值。 在多线程环境下,一个线程对共享变量的操作对其他线程是不可见的。Java提供了volatile来保证可见性,当一个变量被volatile修饰后,表示着线程本地内存无效,当一个线程修改共享变量后他会立即被更新到主内存中,其他线程读取共享变量时,会直接从主内存中读取。当然,synchronize和Lock都可以保证可见性。synchronized和Lock能保证同一时刻只有一个线程获取锁然后执行同步代码,并且在释放锁之前会将对变量的修改刷新到主存当中。因此可以保证可见性。 有序性 定义

什么是JVM?一文简谈运行机制及基本原理!

|▌冷眼眸甩不掉的悲伤 提交于 2020-02-26 02:02:50
JVM的基础概念 JVM的中文名称叫Java虚拟机,它是由软件技术模拟出计算机运行的一个虚拟的计算机。 JVM也充当着一个翻译官的角色,我们编写出的Java程序,是不能够被操作系统所直接识别的,这时候JVM的作用就体现出来了,它负责把我们的程序翻译给系统“听”,告诉它我们的程序需要做什么操作。 我们都知道Java的程序需要经过编译后,产生.Class文件,JVM才能识别并运行它,JVM针对每个操作系统开发其对应的解释器,所以只要其操作系统有对应版本的JVM,那么这份Java编译后的代码就能够运行起来,这就是Java能一次编译,到处运行的原因。 JVM的生命周期 JVM在Java程序开始执行的时候,它才运行,程序结束的时它就停止。 一个Java程序会开启一个JVM进程,如果一台机器上运行三个程序,那么就会有三个运行中的JVM进程。 JVM中的线程分为两种:守护线程和普通线程 守护线程是JVM自己使用的线程,比如垃圾回收(GC)就是一个守护线程。 普通线程一般是Java程序的线程,只要JVM中有普通线程在执行,那么JVM就不会停止。 权限足够的话,可以调用exit()方法终止程序。 JVM的结构体系 JVM的启动过程 1、JVM的装入环境和配置 在学习这个之前,我们需要了解一件事情,就是JDK和JRE的区别。 JDK是面向开发人员使用的SDK,它提供了Java的开发环境和运行环境

MySQL主从复制的线程描述

孤人 提交于 2020-02-25 22:37:01
复制线程概述: MySQL完成主从复制,需要三个线程的参与:一个在(Master)主节点上,另外两个在(Slave)从节点上 1、(Master)Binlog Dump线程: 当有从节点连接到主节点时,主节点就创建一个线程将该主节点的bin-log内容发送到主动连接的从节点上。创建的这个线程可以使用下面的命令在主节点的标准输出上以“Binlog Dump”名字显示。 SHOW PROCESSLIST 为了读取主节点上即将被发送到从节点的每一个事件(Event),binlog Dump线程会对该binlog添加一个锁,直到这个事件被读取到甚至发送到从节点上,这个锁才会被释放。 2、(Slave)I/O线程: 当一个"START SLAVE"语句在从节点上发出时,从节点创建一个I/O线程;用来连接到配置好的主节点上并请求其发送binlog中的更新记录。这个I/O线程读取从binlog Dump线程发送过来的更新信息,将其复制到本地文件内(Relay log)。在"SHOW SLAVE STATUS"语句的输出内容中,显示为:Slave_IO_running;在"SHOW STATUS"语句的输出中显示为:Slave_running 3、(Slave)SQL线程: 从节点创建一个Slave SQL线程去读取由Slave I/O创建的relay log中的内容

单例模式

戏子无情 提交于 2020-02-25 19:27:00
1.单例模式 保证一个类仅有一个实例。 (1)实现方式 1、懒汉模式(线程不安全) 2、懒汉模式(线程安全) 3、饿汉模式(线程安全) 4、静态类内部加载(线程安全) 5、枚举方法(线程安全) 6、双重校验锁法(通常线程安全,低概率不安全) 7、带 volatile 的双重校验锁法(线程安全) 8、使用 ThreadLocal 实现单例模式(线程安全) 9、使用 CAS 锁实现(线程安全) … 实际还有各种奇淫技巧,不只只 9 种方式。 单例模式的安全方式 单例模式大家并不陌生,也都知道它分为什么懒汉式、饿汉式之类的。但是你对单例模式的理解足够透彻吗?今天我带大家一起来看看我眼中的单例,可能会跟你的认识有所不同。 下面是一个简单的小实例: [java] view plaincopyprint? 1. //简单懒汉式 2. public class Singleton { 3. 4. //单例实例变量 5. private static Singleton instance = null; 6. 7. //私有化的构造方法,保证外部的类不能通过构造器来实例化 8. private Singleton() {} 9. 10. //获取单例对象实例 11. public static Singleton getInstance() { 12. 13. if (instance ==

[看书笔记]《深入java虚拟机》——java体系结构(二)

与世无争的帅哥 提交于 2020-02-24 17:35:17
java虚拟机的三种含义: - 抽象的规范 - 一个具体的实现 - 一个运行中的虚拟机实例 ---------------------java虚拟机的生命周期: java虚拟机实例的天职就是负责运行一个java程序。 启动一个java程序,一个虚拟机实例诞生了;程序关闭退出,虚拟机消亡。 有几个java程序正在运行,就有几个java虚拟机实例。每个java程序都运行在自己的java虚拟机实例中。 java虚拟机中有两种线程: - 守护线程:由虚拟机自己使用的(执行垃圾收集线程),java程序也可以把任何线程标记为守护线程。 - 非守护线程:main()这种。 非守护线程都终止时,虚拟机实例才自动退出。(也可以调用Runtime或System的exit()方法退出程序)。 ---------------------java虚拟机的体系结构: 见同目录第五章.Java虚拟机-体系结构图! 方法区和堆是该虚拟机实例的所有线程共享的。 当虚拟机装载一个class文件时,他会从这个class文件包含的二进制数据中解析类型信息,然后把这些类型信息放到方法区中。 当程序运行时,虚拟机会把所有该程序在运行时创建的对象都放到堆中。 每个新线程被创建时,他都将得到它自己的PC寄存器以及一个java栈(不是所有线程共享)。 java虚拟机为每个线程创建内存区,这些内存区域是私有的

深入理解JAVA虚拟机JVM

不打扰是莪最后的温柔 提交于 2020-02-24 16:47:38
深入理解JAVA虚拟机JVM Java 虚拟机(Java virtual machine,JVM)是运行 Java 程序必不可少的机制。java之所以能实现一次编写到处执行,也就是因为jVM。 原理: 编译后的 Java 程序指令并不直接在硬件系统的 CPU 上执行,而是由 JVM 执行。JVM抹平了与具体平台相关的信息,使Java语言编译程序只需要生成在JVM上运行的目标字节码(.class),就可以在多种平台上不加修改地运行。Java 虚拟机在执行字节码时,把字节码解释成具体平台上的机器指令执行。因此实现了java平台无关性。它是 Java 程序能在多平台间进行无缝移植的可靠保证,同时也是 Java 程序的安全检验引擎(还进行安全检查)。 JVM 是 编译后的 Java 程序(.class文件)和硬件系统之间的接口 ( 编译后:javac 是收录于 JDK 中的 Java 语言编译器。该工具可以将后缀名为. java 的源文件编译为后缀名为. class 的可以运行于 Java 虚拟机的字节码。) JVM的工作结构大致如下: JVM结构浅显了解: java开发人员写好的文件,都是.java文件。如果是想要被jvm加载必须要先经过编译为字节码文件。在经过调用javac编译好后生成了java字节码文件(.class)。然后才能被jvm加载。 在生成了class文件之后

python学习笔记-进程线程

你。 提交于 2020-02-23 19:10:48
1.什么是进程(process)? 程序并不能单独运行,只有将程序装载到内存中,系统为它分配资源才能运行,而这种执行的程序就称之为进程。程序和进程的区别就在于:程序是指令的集合,它是进程运行的静态描述文本;进程是程序的一次执行活动,属于动态概念。 在多道编程中,我们允许多个程序同时加载到内存中,在操作系统的调度下,可以实现并发地执行。这是这样的设计,大大提高了CPU的利用率。进程的出现让每个用户感觉到自己独享CPU,因此,进程就是为了在CPU上实现多道编程而提出的。 2.什么是线程(thread)? 线程是操作系统能够进行运算调度的最小单位。它被包含在进程之中,是进程中的实际运作单位。一条线程指的是进程中一个单一顺序的控制流,一个进程中可以并发多个线程,每条线程并行执行不同的任务 3.有了进程为什么还要线程? 进程有很多优点,它提供了多道编程,让我们感觉我们每个人都拥有自己的CPU和其他资源,可以提高计算机的利用率。很多人就不理解了,既然进程这么优秀,为什么还要线程呢?其实,仔细观察就会发现进程还是有很多缺陷的,主要体现在两点上: 进程只能在一个时间干一件事,如果想同时干两件事或多件事,进程就无能为力了。 进程在执行的过程中如果阻塞,例如等待输入,整个进程就会挂起,即使进程中有些工作不依赖于输入的数据,也将无法执行。 例如,我们在使用qq聊天,