`
janeky
  • 浏览: 365941 次
  • 性别: Icon_minigender_1
  • 来自: 广州
社区版块
存档分类
最新评论

jvm学习笔记(2)多线程的相关原理

    博客分类:
  • jvm
 
阅读更多

  • 简介
  • 本文是尝试从虚拟机的角度来分析java线程的一些本质

  • 线程模型
  • java的线程模型可以通过下图来说明:

    一个对象都有一个相关的锁,每次只能由获得它的一个线程来操作。获得它的线程可以wait,放弃锁,进入等待区域,待被唤醒notify后,它会重新查看锁的状态,参与锁的竞争

  • 虚拟机实现
  • 查看class文件的汇编代码,可以看到,进入同步区域和退出同步区域分别由两条指令 monitorenter和monitorexit。两者之间的代码块每次只能有一个线程执行

  • 同步
  • 分为两种,同步语句和同步方法。同步语句首先得获得synchronized(obj) obj对象的锁,否则,同步语句块内的语句是不会执行的。同步方法是在方法前面加修饰符synchronize。同理,要执行该方法,得闲获取方法所属类的锁(其实是对Class对象上锁)。当同步块语句或者同步方法执行完,无论中间是否有异常,最终都会释放锁

  • 内存模型
  • java内存模型分为主内存和工作内存。每个线程只能操作该工作内存内的数据。两种内存的之间的交互是按照一定协议的,即一个变量如何从主内存拷贝到工作内存、如何从工作内存同步回主内存之类的细节。内存模型定义了一下操作

    lock:作用于主内存的变量,将它标志为一条线程单独占有
    unlock:作用于主内存变量,把处于锁定状态的变量释放,可以被其他线程lock
    read:作用于主内存的变量,把一个变量的值从主内存传输到线程的工作内存中,以便接下来的load动作使用
    load:作用于工作内存的变量,将上步read的变量放入工作内存的变量副本中
    use:作用于工作内存的变量, 将工作内存的变量传递给执行引擎
    assign:作用于工作内存的变量,将执行引擎接收到的值赋值给工作内存的变量
    store:作用于工作内存的变量,将工作内存的变量传送到主内存
    write:作用于工作内存的变量,它把store操作从工作内存得到的变量值放入主内存的变量中

  • volatile
  • 主要有两个作用:
    1.保证对该变量的改变是对每个线程可见的(原理是,每次改变后强制同步到主内存,需要一定损耗)。
    2.避免指令乱排

  • jvm的锁优化
  • 1.自旋锁与自适应自旋
    简单一点说,两个线程同时竞争一个锁,其中一个获得了,后面那个本来要阻塞的。为了减少阻塞带来的性能损失,让它自旋(忙循环),看看第一个锁是否很快释放锁。忙循环次数如果不是固定的,而是由前一次在同一个锁上的自旋时间及锁的拥有者的状态来决定的。就是自适应自旋了

    2.锁消除
    如果能判断不必要的锁,直接就消除相关锁

    3.锁粗化
    如果对连续的操作,使用了多个锁,可以同一个范围较大的锁来替换

    4.轻量级锁
    这个原理比较复杂,涉及到一些特定的锁结构。简单说明,跟传统的锁(重量级)不同,轻量级锁是通过尝试改变一个对象的锁标志位来实现加锁操作的

    5.偏向锁
    如果去详细了解了上面的轻量级锁,就发现他们原理是差不多的,只不过偏向锁偏向的第一个获得它的线程

  • 参考资料
  • 1.深入java虚拟机
    2.深入理解java虚拟机

    更多关于jvm的内容可以继续访问 www.iamcoding.com

    分享到:
    评论

    相关推荐

      JVM工作原理学习笔记

      Java虚拟机(JVM)是Java程序运行的基础,它是一个抽象的计算机系统,负责执行Java字节码。本文将深入探讨JVM的工作...这本《JVM工作原理学习笔记》应包含了这些内容的详细讲解,对于学习和提升JVM相关知识极具价值。

      JVM学习笔记

      ### JVM学习笔记 #### JVM内存模型 (JMM) JVM内存模型主要分为以下几个部分: - **Java堆**:这是所有线程共享的一块区域,在虚拟机启动时创建。主要用于存放对象实例,几乎所有的对象实例都在这里分配内存。 - *...

      java之jvm学习笔记十一(访问控制器)-源码

      本文将深入探讨JVM中的访问控制器,主要基于“java之jvm学习笔记十一(访问控制器)-源码”这一主题,以及相关的源码分析。 首先,我们得了解Java的安全模型。Java安全模型基于一种称为安全管理器(SecurityManager)...

      Java分布式应用学习笔记03JVM对线程的资源同步和交互机制

      ### Java分布式应用学习笔记03:JVM对线程的资源同步和交互机制 在深入探讨Java虚拟机(JVM)如何处理线程间的资源同步与交互机制之前,我们先来明确几个关键概念:线程、多线程、同步、并发以及它们在Java中的实现...

      jvm视频及笔记

      11. **线程并发**:JVM如何支持多线程,包括线程同步机制如synchronized、Lock等,以及线程池的使用和优化。 通过观看"jvm视频",你可以直观地了解这些概念,并通过"jvm笔记"加深理解和记忆。理论学习后,实践操作...

      JVM 学习笔记(Java虚拟机)

      **JVM学习笔记(Java虚拟机)** Java虚拟机(JVM)是Java语言的核心组成部分,它是Java程序运行的平台,负责解释和执行字节码。深入理解JVM对于优化Java应用程序性能至关重要。本笔记将从以下几个方面详细介绍JVM:...

      JVM学习笔记一(线程私有的内存区域)

      程序计数器:因为cpu会划分为时间片给多个线程执行,所以需要程序计数器记录下指令执行到具体的位置,当下次线程切换时,从记录的位置继续执行,同时它也是唯一不会发生OOM错误的。 本地方法栈与虚拟机栈在某些jvm...

      JVM学习笔记2018-4-151

      Java虚拟机(JVM)是Java程序运行的核心,...总结来说,这篇JVM学习笔记涵盖了对象声明、内存分配的方法以及虚拟内存的基本原理。理解这些概念对于深入理解Java程序的运行机制、性能优化以及解决内存相关问题至关重要。

      Java学习笔记包含JVM、spring、源码分析、多线程、offer题解、设计模式、面试宝典.zip

      Java学习笔记包含JVM、spring、源码分析、多线程、offer题解、设计模式、面试宝典.zip Java学习笔记,内容包括JVM,spring,hashMap实现源码分析,多线程,剑指offer题解,设计模式。然后根据面试的重点,又将很多从...

      java之jvm学习笔记十而(访问控制器的栈校验机制)-步骤2源码

      本篇学习笔记将深入探讨这一机制,主要聚焦于步骤2的源码分析。在Java的世界里,类型安全至关重要,尤其是在多线程环境下,防止非法的类型访问和操作能避免潜在的安全风险和程序崩溃。 栈校验机制主要是为了执行...

      java多线程笔记

      在多线程环境下,多个线程可以并行地在单个进程中执行,使得程序能够同时处理多项任务。 Java中的线程是通过`Thread`类或实现`Runnable`接口来创建的。你可以直接继承`Thread`类并重写`run()`方法,或者创建一个...

      JVM的学习笔记PDF版

      8. **线程模型**:JVM支持多线程并发执行,线程间通信和同步通过synchronized、wait/notify、ReentrantLock等机制实现。理解线程状态转换和死锁问题是线程编程的基础。 9. **类加载器体系**:包括bootstrap loader...

      JVM笔记(阳哥).zip

      这份笔记涵盖了JVM的基础概念、内存管理、类加载机制、性能优化等多个方面,对于理解Java程序的运行机制以及提升开发效率具有重要的指导意义。 一、JVM基础 Java虚拟机(JVM)是Java程序运行的核心,它提供了平台...

      深入JVM笔记word版

      ### 深入解析 JVM 内存区域 #### 一、Java内存区域概述 Java虚拟机(JVM)作为Java程序的运行环境,负责管理和分配内存...理解这些区域对于深入学习JVM原理至关重要,也有助于开发者编写更加高效和可靠的Java应用程序。

      黑马JVM学习笔记二

      本文将深入探讨JVM的内存结构,特别是程序计数器、虚拟机栈、本地方法栈、堆内存以及它们在多线程环境下的工作原理。 程序计数器是JVM内存结构的一部分,它是一个非常小但至关重要的组件。程序计数器用于存储即将...

      JVM性能学习笔记思维导图

      本文将根据"JVM性能学习笔记思维导图"的主题,详细阐述JVM的主要组成部分,性能调优的关键点以及相关的工具与实践策略。** 1. **JVM结构与内存模型** - **类装载器(ClassLoader)**:负责加载类文件,确保类在运行...

      JVM内存管理学习笔记

      《JVM内存管理学习笔记》 在Java世界中,JVM(Java Virtual Machine)是运行所有Java应用程序的核心。深入理解JVM内存管理对于优化程序性能、预防和解决内存泄漏问题至关重要。本文将从JVM内存模型、内存区域划分、...

      多线程-狂神说Java学习笔记

      本学习笔记将深入探讨Java多线程的相关知识,包括其原理、实现方式、同步机制以及常见问题。 ### 一、多线程的基本概念 多线程是指在一个程序中存在两个或更多的执行线程,这些线程共享同一内存空间,但各自拥有...

      软件工程师的学习笔记,包含网络、操作系统、设计模式、JVM、多线程与高并发、Spring、MySQL......zip

      这篇学习笔记涵盖了软件工程师在职业发展中需要掌握的关键领域,包括网络、操作系统、设计模式、Java虚拟机(JVM)、多线程与高并发处理、Spring框架以及MySQL数据库。以下是对这些知识点的详细解读: 1. **网络**...

      Java多线程学习笔记

      ### Java多线程学习笔记 #### 一、线程的基本概念 在计算机科学中,**线程**(Thread)是程序执行流的最小单位。一个标准的程序只能做一件事情,而通过多线程技术,可以让程序同时处理多个任务。在Java中,线程是...

    Global site tag (gtag.js) - Google Analytics