本地线程

Java之Object类

a 夏天 提交于 2019-12-01 09:54:33
#################   object类 ################# JDK中所有类的基类--java.lang.Object Object类的结构图 什么是native方法?   native关键字标识的Java方法为本地方法,底层是由C/C++程序编译后dll文件,Java加载dll文件后,可通过本地方法调用dll函数。 1. 类构造器   是创建Java对象的途径之一,通过new关键字调用构造器完成对象的实例化,或通过构造器对象进行相应的初始化。在JDK的object类源码中,系统会自动添加一个无参构造器。 1 public Object(){} 2 Object obj =new Object(); //构造一个Object类的对象 2. registerNatives方法 1 private static native void registerNatives(); 2 static { 3 registerNatives(); 4 }   静态代码块是一个类在初始化过程中必定会执行的内容,所以在类加载时会执行该方法,通过该方法来注册本地方法。 3. getClass方法 public final native Class<?> getClass();   首先,该方法由final声明本地方法,不能被重写,作用是返回运行时类对象

Java内存模型

我是研究僧i 提交于 2019-12-01 09:52:42
Java内存模型规范了Java虚拟机与计算机内存是如何协同工作的。Java虚拟机是一个完整的计算机的一个模型,因此这个模型自然也包含一个内存模型——又称为Java内存模型。 如果你想设计表现良好的并发程序,理解Java内存模型是非常重要的。Java内存模型规定了如何和何时可以看到由其他线程修改过后的共享变量的值,以及在必须时如何同步的访问共享变量。 原始的Java内存模型存在一些不足,因此Java内存模型在Java1.5时被重新修订。这个版本的Java内存模型在Java8中人在使用。 Java内存模型内部原理 Java内存模型把Java虚拟机内部划分为线程栈和堆。这张图演示了Java内存模型的逻辑视图。 每一个运行在Java虚拟机里的线程都拥有自己的线程栈。这个线程栈包含了这个线程调用的方法当前执行点相关的信息。一个线程仅能访问自己的线程栈。一个线程创建的本地变量对其它线程不可见,仅自己可见。即使两个线程执行同样的代码,这两个线程任然在在自己的线程栈中的代码来创建本地变量。因此,每个线程拥有每个本地变量的独有版本。 所有原始类型的本地变量都存放在线程栈上,因此对其它线程不可见。一个线程可能向另一个线程传递一个原始类型变量的拷贝,但是它不能共享这个原始类型变量自身。 堆上包含在Java程序中创建的所有对象,无论是哪一个对象创建的。这包括原始类型的对象版本

Java读源码之Thread

▼魔方 西西 提交于 2019-12-01 08:58:31
前言 JDK版本:1.8 阅读了Object的源码,wait和notify方法与线程联系紧密,而且多线程已经是必备知识,那保持习惯,就从多线程的源头Thread类开始读起吧。由于该类比较长,只读重要部分 源码 类声明和重要属性 package java.lang; public class Thread implements Runnable { private volatile String name; // 优先级 private int priority; //是否后台 private boolean daemon = false; /* JVM state */ private boolean stillborn = false; // 要跑的任务 private Runnable target; // 线程组 private ThreadGroup group; // 上下文加载器 private ClassLoader contextClassLoader; // 权限控制上下文 private AccessControlContext inheritedAccessControlContext; // 线程默认名字“Thread-{{ threadInitNumber }}” private static int threadInitNumber; // 局部变量

JVM之内存结构详解

落爺英雄遲暮 提交于 2019-12-01 08:50:18
对于开发人员来说,如果不了解Java的JVM,那真的是很难写得一手好代码,很难查得一手好bug。同时,JVM也是面试环节的中重灾区。今天开始,《JVM详解》系列开启,带大家深入了解JVM相关知识。 我们不能为了面试而面试,但是学习会这些核心知识你必定会成为面试与工作中“最亮的一颗星”。本系列首发于微信公众号“程序新视界”。下面,开启我们的第一篇文章《JVM之内存结构详解》。 学习也是要讲究方式方法的,本系列学习过程中会引导大家通过《 费曼学习法 》来学习,同时尽量采用图文方式来进行讲解。正所谓一图胜千言。 思考一下 学习一项知识总该知道为什么学习吧。有人会说,这些写代码好像又用不上,貌似所有的事情JVM都替我们做好了。那就,思考一下为什么要学习JVM虚拟机结构。 那你是否遇到这样的困惑:堆内存该设置多大?OutOfMemoryError异常到底是怎么引起的?如何进行JVM调优?JVM的垃圾回收是如何?甚至创建一个String对象,JVM都做了些什么? 这些疑问随着学习的深入都会慢慢得到解答,而要解决这些问题的第一步,就是先了解JVM的构成。 JVM内存结构 java虚拟机在执行程序的过程中会将内存划分为不同的数据区域,看一下下图。 如果理解了上图,JVM的内存结构基本上掌握了一半。通过上图我们可以看到什么?外行看热闹,内行看门道。从图中可以得到如下信息。 第一,JVM分为五个区域

Thread线程框架学习

懵懂的女人 提交于 2019-12-01 08:25:56
原文: https://www.cnblogs.com/wangkeqin/p/9351299.html Thread线程框架 线程定义: 线程可以理解为一个特立独行的函数。其存在的意义,就是并行,避免了主线程的阻塞。 ----------------------------thread与函数---------------------------------- 线程启动    C++ 线程的启动, 只需要 #include <thread>即可。 线程对象的创建, 意味着线程的开始。 1)同步 #include <iostream> #include <thread> #include <unistd.h> using namespace std; void func() { cout<<"thread id:"<<this_thread::get_id()<<endl; cout<<"do some work"<<endl; sleep(3); } int main() { cout<<"maint thread id:"<<this_thread::get_id()<<endl; thread t(func); t.join(); return 0; }    t.join 和 t.detach 标志着, 线程对象和线程的关系。 t.join 表示, 线程与线程对象 的同步关系

Java内存区域与内存溢出异常

旧巷老猫 提交于 2019-12-01 08:21:05
Java虚拟机在执行Java程序的过程中会把它所管理的内存划分为若干个不同的数据区域。这些区域都有各自的用途,以及创建和销毁的时间,有的区域随着虚拟机进程的启动而存在,有些区域则依赖用户线程的启动和结束而建立和销毁。 程序计数器 程序计数器是一块较小的内存空间,它可以看作是当前线程所执行的字节码的行号指示期。字节码解释器工作时就是通过这个计算器的值来选取下一条需要执行的字节码指令,分支、循环、跳转、异常处理、线程恢复等基础功能都需要依赖这个计数器来完成。 由于Java虚拟机的多线程是通过线程轮流切换并分配处理器执行时间的方式来实现的,在任何一个确定的时刻,一个处理器(对于多核处理器来说是一个内核)都只会执行一条线程中的指令。因此,为了线程切换后能恢复到正确的执行位置,每条线程都需要有一个独立的程序计数器,各条线程之间计数器互不影响,独立存储,我们称这类内存区域为“线程私有”的内存。 如果线程正在执行的是一个Java方法,这个计数器记录的是正在执行的虚拟机字节码指令的地址。如果正在执行的是Native方法,这个计数器值则为空(Undefined)。 Java虚拟机栈 与程序计数器一样,Java虚拟机栈(Java Virtual Machine Stacke)也是线程私有的,它的生命周期与线程相同。虚拟机栈描述的是Java方法执行的内存模型:每个方法在执行的同时都会创建一个帧栈

JVM原理与深度调优

送分小仙女□ 提交于 2019-12-01 08:10:20
什么是jvm jvm是java虚拟机 运行在用户态、通过应用程序实现java代码跨平台、与平台无关、实际上是"一次编译,到处执行" 1.从微观来说编译出来的是字节码!去到哪个平台都能用,只要有那个平台的JDK就可以运行!字码好比是一个人,平台好比为国家,JDK好比这个国家的语言!只要这个人(字节码)有了这个国家的语言(JDK)就可以在这个国家(平台)生活下去。 2.JDK 是整个Java的核心,包括了Java运行环境(Java Runtime Envirnment),一堆Java工具和Java基础的类库(rt.jar)。 3.Java虚拟机(JVM)一种用于计算机设备的规范,可用不同的方式(软件或硬件)加以实现。编译虚拟机的指令集与编译微处理器的指令集非常类似。Java虚拟机包括一套字节码指令集、一组寄存器、一个栈、一个垃圾回收堆和一个存储方法域。 4.java编译出来的是一种“java字节码”,由虚拟机去解释执行。 而c和c++则编译成了二进制,直接交由操作系统执行。 5.所谓的一次编译、到处执行,即只需在一个地方编译,在其他各个平台下都可以执行。 6.与平台无关指的是JAVA只运行在自己的JVM上,不需要依赖任何其他的底层类,所以和操作系统没有任何联系,平台是说运行的系统 内存结构图 class文件 class文件径打破了 C 或者C++等语言所遵循的传统

JAVA面经整理

佐手、 提交于 2019-12-01 07:53:37
一、Java SE ❤1、Java基础 1、一个十进制的数在内存中是怎么存的? Java支持的数据类型有哪些?什么是自动拆装箱? int 和 Integer 有什么区别 ? 什么时候使用int 什么时候使用Integer? 2、==比较的是什么? 3、hashCode()和equals()方法有什么联系? 为什么重写equals还要重写hashcode? Object若不重写hashCode()的话,hashCode()如何计算出来的?若对一个类不重写,它的equals()方法是如何比较的? 4、一个十进制的数在内存中是怎么存的? 5、Java语言中float和double数据类型的精度是多少?它们在内存中是怎么存储的?和Decimal有什么区别? 6、为啥有时会出现4.0-3.6=0.40000001这种现象? 7、不借助四则运算如何实现加法 8、char可以存汉字吗,底层怎么存的 9、Java的字符集是什么 10、什么是值传递和引用传递? 11、数组(Array)和列表(ArrayList)有什么区别?什么时候应该使用Array而不是ArrayList? 12、StringBuilder 和StringBuffer的区别 ? 底层实现上呢? 13、String为什么要设置成final类型?String是不变的吗?String为什么不可变?怎么实现不变的? 14、&和&&的区别?

[多线程] Wait和Notify方法解析

拈花ヽ惹草 提交于 2019-12-01 07:21:56
一 wait/notify如何使用   wait\notify 这两个方法是Object 类中的方法,这两个方法包括他们的重载方法一共有5个,而Object 类中一共才 12 个方法,可见这2个方法的重要性。我们先看看 JDK 中的代码: public final native void notify(); public final native void notifyAll(); public final void wait() throws InterruptedException { wait(0); } public final native void wait(long timeout) throws InterruptedException; public final void wait(long timeout, int nanos) throws InterruptedException { if (timeout < 0) { throw new IllegalArgumentException("timeout value is negative"); } if (nanos < 0 || nanos > 999999) { throw new IllegalArgumentException("nanosecond timeout value out of

java并发之内存模型

百般思念 提交于 2019-12-01 07:03:24
java内存模型知识导图 一 并发问题及含义 并发编程存在原子性、可见性、有序性问题。 原子性即一系列操作要么都执行,要么都不执行。 可见性,一个线程对共享变量的修改,另一个线程可能不会马上看到。由于多核CPU,每个CPU核都有高速缓存,会缓存共享变量,某个线程对共享变量的修改会改变高速缓存中的值,但却不会马上写入内存。另一个线程读到的是另一个核缓存的共享变量的值,出现缓存不一致问题。 有序性,即程序执行的顺序按照代码的先后顺序执行。编译器和处理器会对指令进行重排,以优化指令执行性能,重排不会改变单线程执行结果,但在多线程中可能会引起各种各样的问题。 二 内存模型 为了保证共享内存的正确性(可见性、有序性、原子性),内存模型定义了共享内存系统中多线程程序读写操作行为的规范。内存模型解决并发问题 主要采用两种方式:限制处理器优化和使用内存屏障。 顺序一致性内存模型是一种理论参考模型,提供了极强的内存可见性保证,具有两大特性: 一个线程的所有操作按照程序的顺序执行,而不能重排序。 所有线程只能看到单一的执行顺序。每个操作都必须原子执行且立刻对其它线程可见。 顺序一致性内存模型禁止很多处理器和编译器重排,影响执行性能,处理器内存模型和JMM对顺序一致性内存模型进行放松,执行性能:处理器内存模型>JMM>顺序一致性内存模型,易编程性:处理器内存模型<JMM<顺序一致性内存模型。 三