本地线程

自动内存管理机制

谁说我不能喝 提交于 2020-01-16 06:03:10
对于Java程序员来说,在虚拟机自动内存管理机制的帮助下,不需要在为每个new操作去写配对的delete/free代码,不容易出现内存泄漏和内存溢出的问题,Java程序员把内存控制的权力交给了Java虚拟机 运行时数据区域 Java虚拟机在执行java程序的过程中会把他所管理的内存划分为若干个不同的数据区域 程序计数器 (program counter register) 概念: 当前线程所执行的字节码的行号解释器 在虚拟机的概念模型里,字节码解释器工作时通过改变计数器的值选取下一条要执行的字节码指令 在物理上,通过寄存器来实现(读取快) 特点: ① 线程私有,每个线程有一个互不影响,用于线程切换后恢复到正确的执行位置 ② 不存在内存溢出 虚拟机栈 (Java Virtual Machine Stacks) 概念: 栈:栈是线程运行时所需要的内存空间 栈帧:栈里面有一个一个的栈帧,栈帧是每个方法运行时所需的内存,所有的方法再执行时创建一个栈帧,用于存储 ① 局部变量表,② 操作数栈(对应当前的指令,栈帧对应的是方法),③ 动态链接, 方法出口等信息 每调用执行一个方法就会往栈里面压入相应的栈帧,执行完再弹出 局部变量表:存放着编译期间可知的各个基本数据类型,对象引用和returnAddress类型(指向一条字节码指令的地址) 对应着当前正在执行的方法的栈帧叫做活动栈帧 特点: ①

Java多线程面试题整理

◇◆丶佛笑我妖孽 提交于 2020-01-15 09:38:38
1) 什么是线程? 线程是操作系统能够进行运算调度的最小单位,它被包含在进程之中,是进程中的实际运作单位。程序员可以通过它进行多处理器编程,你可以使用多线程对运算密集型任务提速。比如,如果一个线程完成一个任务要100毫秒,那么用十个线程完成改任务只需10毫秒。Java在语言层面对多线程提供了卓越的支持,它也是一个很好的卖点。 2) 线程和进程有什么区别? 线程是进程的子集,一个进程可以有很多线程,每条线程并行执行不同的任务。不同的进程使用不同的内存空间,而所有的线程共享一片相同的内存空间。别把它和栈内存搞混,每个线程都拥有单独的栈内存用来存储本地数据。 3) 如何在Java中实现线程? 1)java.lang.Thread 类的实例就是一个线程但是它需要调用java.lang.Runnable接口来执行, 2)由于线程类本身就是调用的Runnable接口所以你可以继承java.lang.Thread 类或者直接调用Runnable接口来重写run()方法实现线程。 3). 实现Callable接口通过FutureTask包装器来创建Thread线程 Callable接口(也只有一个方法)定义如下: public interface Callable<V> { V call() throws Exception; } public class SomeCallable<V>

JVM内核解读

≯℡__Kan透↙ 提交于 2020-01-15 07:41:46
JVM是Java Virtual Machine(Java虚拟机)的缩写,这里要分清的是,JVM与java语言是相对独立的,也就是说只要有符合java语言规范的虚拟机也可以运行java语言。 1.JVM的启动流程 2.JVM基本结构 PC寄存器: 1.每个线程拥有一个PC寄存器 2.在线程创建时创建 3.指向下一条指令的地址 4.执行本地方法时,PC的值为undefined 方法区: 1.保存装载的类信息   类型的常量池   字段,方法信息   方法字节码 2.通常和永久区(perm)关联在一起 jdk1.6 String等常量信息置放于方法区 jdk1.7 移动到堆 java堆: 1.和程序开发密切相关 2.保存应用系统对象 3.所有线程共享 4.对分代GC(垃圾回收)来说,堆也是分代的 5.GC主要工作区间 java栈: 1.线程私有 2.由一系列帧组成(因此也称作帧栈) 3.帧保存一个方法的局部变量,操作数栈,常量池指针 4.每一个方法调用创建一个帧,并压栈 3.堆栈方法交互 来源: https://www.cnblogs.com/sz-zzm/p/5229405.html

敲黑板,做笔记!金三银四时去面试,这几个重要的面试题千万别忘记!

二次信任 提交于 2020-01-15 00:54:53
快春节了,又到了令人兴奋的年终奖环节了,而程序员的年终奖,往往令人羡慕 做了个盘点:互联网大厂的年终奖vs我们的年终奖,真酸!换个公司还来得及吗? 大厂程序员的年终奖,实在令人羡慕! 但是不能光羡慕啊,马上就到金三银四了,面试的黄金时节,还不准备起来。 有可能,2020年底你也有了呢。 BATJ、字节跳动面试专题,算法专题,高端技术专题,混合开发专题,java面试专题,Android,Java小知识,到性能优化.线程.View.OpenCV.NDK等已经上传到了的我的GitHub 大家点击我的GitHub地址: https://github.com/Meng997998/AndroidJX 点下star一起学习 下面就来讲讲Android面试中很重要的面试题 说一下java多态的理解,以及接继承,和接口的理解 对于多态的定义 不同类的对象对统一函数做出不同对的响应或者动作。 作用 主要是消除类之间的耦合性,灵活性比较强,利于代码的编写和修改。尤其在处理大量的运算和操作时,可以灵活地简化,替换或者是修改代码! 三个必要条件 1、一个凳子(继承extends) 2、重写 3、父类引用指向子类对象 for example **测试结果: oKhttp的 原理 1.同步和异步: 1.异步使用了Dispatcher来将存储在 Deque 中的请求分派给线程池中各个线程执行。 2

ThreadLocal = 本地线程?

a 夏天 提交于 2020-01-15 00:33:03
一、定义 ThreadLocal 是 JDK 包提供的,从名字来看, ThreadLocal 意思就是本地线程的意思。 1.1 是什么? 要想知道他是个啥,我们看看 ThreadLocal 的源码(基于 JDK 1.8 )中对这个类的介绍: This class provides thread-local variables. These variables differ from their normal counterparts in that each thread that accesses one (via its {@code get} or {@code set} method) has its own, independently initialized copy of the variable. {@code ThreadLocal} instances are typically private static fields in classes that wish to associate state with a thread (e.g., a user ID or Transaction ID). 大致能够总结出: TreadLocal 可以给我们提供一个线程内的局部变量,而且这个变量与一般的变量还不同,它是每个线程独有的,与其他线程互不干扰的;

unable to create new native thread

谁说胖子不能爱 提交于 2020-01-14 17:32:30
由于java线程的创建是使用本地内存的,出现unable to create new native thread 可以: 1、减小堆内存 -Xmx512m ,以便使用更多的本地内存 2、较少每个线程所占用的内存空间,以便创建更多的线程:-Xmx1g -Xss128k 来源: CSDN 作者: yinguobin 链接: https://blog.csdn.net/qq_35203362/article/details/103975457

c++ 线程局部变量thread_local

僤鯓⒐⒋嵵緔 提交于 2020-01-14 10:53:13
Linux 中的线程局部存储(一)   本章节转自: https://blog.csdn.net/cywosp/article/details/26469435   在Linux系统中使用C/C++进行多线程编程时,我们遇到最多的就是对同一变量的多线程读写问题,大多情况下遇到这类问题都是通过锁机制来处理,但这对程序的性能带来了很大的影响,当然对于那些系统原生支持原子操作的数据类型来说,我们可以使用原子操作来处理,这能对程序的性能会得到一定的提高。   那么对于那些系统不支持原子操作的自定义数据类型,在不使用锁的情况下如何做到线程安全呢?本文将从线程局部存储方面,简单讲解处理这一类线程安全问题的方法。 一、数据类型   在C/C++程序中常存在全局变量、函数内定义的静态变量以及局部变量,对于局部变量来说,其不存在线程安全问题,因此不在本文讨论的范围之内。全局变量和函数内定义的静态变量,是同一进程中各个线程都可以访问的共享变量,因此它们存在多线程读写问题。   在一个线程中修改了变量中的内容,其他线程都能感知并且能读取已更改过的内容,这对数据交换来说是非常快捷的,但是由于多线程的存在,对于同一个变量可能存在两个或两个以上的线程同时修改变量所在的内存内容,同时又存在多个线程在变量在修改的时去读取该内存值,如果没有使用相应的同步机制来保护该内存的话,那么所读取到的数据将是不可预知的

Java volatile关键字实现原理

冷暖自知 提交于 2020-01-14 04:43:33
场景引入 可见性问题 先来看一张图: 上面的图,是简化版的Java内存模型,一个线程有自己的工作内存,同时还有一个共享的主内存。 线程1和线程2读取数据data时,先从主内存里加载data变量的值到工作内存,然后才可以使用那个值。 假设现在线程1修改了data变量的值为1,然后将这个修改写入到自己的工作内存。那么此时,线程1的工作内存里data的值为1,而主内存里data的值还是0。线程2的工作内存data值也是0。 这就尴尬了,线程1和线程2操作的是用一个变量data,但由于线程本地缓存的存在,导致线程1对data变量的修改,线程2不能及时看到。 这就是Java并发编程中的 可见性问题 : 当一个线程修改某个共享变量的值,其他线程是否能够立即知道这个修改。 值得注意的是,上面的Java内存模型是极其简化的,真实的情况远比上面复杂。 volatile的作用及实现原理 要解决上述可见性问题,我们可以使用 volatile 关键字。 在加入volatile关键字后,线程1只要修改data变量的值,就会在修改工作内存data变量值的同时,强制将修改刷新到主内存中。与此同时,线程2需要读取data变量时,先强制将主内存的值刷新到工作内存中,从而保证线程2每次读取都是最新的值。如下图: volatile工作原理如上所述,其在JVM底层的实现原理, 涉及到内存屏障相关概念 。简单来说

iOS学习——锁

你说的曾经没有我的故事 提交于 2020-01-14 04:17:18
  在多线程学习中,必然会涉及到不同线程对同一资源的调取,面对这种调用不加以控制,就会产生数据混乱的情况。最常见的情况莫过于买票,多个售票员售票肯定是同时操作,这样就会开启多条线程,但是这种售票方式会产生票数不对的情况。 - (void)demo1 { //售票员A NSThread *threadA = [[NSThread alloc] initWithTarget:self selector:@selector(sellTikets) object:nil]; threadA.name = @"threadA"; [threadA start]; //售票员B NSThread *threadB = [[NSThread alloc] initWithTarget:self selector:@selector(sellTikets) object:nil]; threadB.name = @"threadB"; [threadB start]; } - (void)sellTikets{ while (YES) { if (self.tiketNum > 0) { self.tiketNum -- ; NSLog(@"还剩%d张票 %@",self.tiketNum,[NSThread currentThread]); }else { NSLog(@"票卖完了 %@",

并发编程学习记录

a 夏天 提交于 2020-01-14 02:44:20
重要知识点 现代系统基本的构造并发程序的方法 进程 :用这个方法,每个逻辑流都是一个进程,由内核来调度和维护。因为进程有独立的虚拟地址空间,想要和其他流通信,控制流必须使用某种显式的 进程间通信机制 。 I/O多路复用 :在这种形式的并发编程中,应用程序在一个进程的上下文中显示地调度它们自己的逻辑流。逻辑流被模型化为状态机,数据到达文件描述符后,主程序显示地从一个状态转化到另一个状态。因为程序是一个单独的进程,所以所用流共享同一个地址空间。 线程 :线程是运行在一个单一进程上下文中的逻辑流,由内核进行调度。由内核进行调度,共享同一个虚拟地址空间。 基于进程的并发编程的优缺点 优点: 进程不可能不小心覆盖另一个进程的虚拟存储器。 缺点: 独立的地址空间使得进程共享状态信息变得更加困难。为了共享信息,它们必须使用显示的IPC(进程间通信)机制,而进程控制和IPC的开销很高,因此会比较慢。 基于I/O多路复用技术的并发编程的优缺点 优点: 它比基于进程的设计给了程序员更多的对程序行为的控制。 每个逻辑流都能访问该进程的全部地址空间,这使得流之间共享数据变得容易。 缺点: 编码复杂。 线程与线程池 线程不是按照严格的父子层次来组织的。和一个线程相关的线程组成一个对等(线程)池独立于其他线程创建的线程。 主线程和其他线程的区别仅在于它总是进程中第一个运行的线程。在对等线程池中