首页
学习
活动
专区
工具
TVP
发布
精选内容/技术社群/优惠产品,尽在小程序
立即前往

Java虚拟机--(互斥同步与非阻塞同步)和锁优化

注意一些情况: synchronized同步块对同一线程来说是可重入的,不会出现自己把自己锁死的问题; 同步块在已进入线程执行完之前,会阻塞后面线程的进入; Java线程是映射到操作系统的原生线程上的,...非阻塞同步(乐观锁): 互斥同步最主要的问题就是进行线程阻塞和唤醒带来的性能问题,因此互斥同步也成为阻塞同步。阻塞同步属于一种悲观锁策略,总是认为只要不做这忘却的同步措施(加锁)就肯定会出现问题。...如果前一次的自旋线程刚刚成功获得锁,那么虚拟机认为这次也会容易获得锁,进而允许自旋线程多自旋几次比如100次;而如果对于某个锁自旋很少成功过,那么以后的线程可能直接忽略掉自旋过程。...锁清除: 锁清除是指虚拟机即时编译器在运行时,会将代码上要求同步,但被检测到实际上不可能出现共享数据竞争的锁进行清除。锁清除的主要判定依据来源于逃逸分析的数据支持。...如果虚拟机探测到有这样的操作,就会把加锁同步的范围扩展(粗化)到整个操作序列之外。 轻量级锁: “轻量级”是相对于使用系统互斥量实现的传统锁而言的,因此传统的锁机制就是重量级锁。

1.1K50

Java虚拟机--Java发展史Java虚拟机

Java虚拟机 从今开始,笔者开始向大家讲解JAVA虚拟机的知识,有没有很兴奋!!!! 对于JAVA开发者来说,虚拟机再熟悉不过,每天的工作中都会接触,但是总有一种“近在眼前,却又远在天边”的感觉。...既然学习虚拟机,那么关于Java的相关历史还是有必要去了解的,在本章节中,笔者将会先介绍Java的发展历史,再说说Java虚拟机的发展历史! 接下里,就让我们开始第一章节的学习吧。...在JDK1.0版本中,主要技术包括:Java虚拟机、AWT等。...在Java1.2这个版本中,Java虚拟机第一次内置了JIT(Just In Time)编译器,之前版本的Sun Classic VM虚拟机只能以外挂的形式使用JIT编译器。...在这个版本中,Java虚拟机做了大量改进,包括锁与同步、垃圾收集、类加载等。

1.5K70
  • 您找到你想要的搜索结果了吗?
    是的
    没有找到

    Java同步容器

    ArrayList,HashSet,HashMap都是线程非安全的,在多线程环境下,会导致线程安全问题,所以在使用的时候需要进行同步,这无疑增加了程序开发的难度。所以JAVA提供了同步容器。...Stack也是一个同步容器,也是使用synchronized进行同步,继承与Vector,是数据结构中的,先进后出。 HashTable和HashMap很相似,但HashTable进行了同步处理。...同时也通过了相关了方法创建同步容器类 Vector package com.rumenz.task; import java.util.List; import java.util.Vector; import...(Thread.java:748) 原因分析 Vector是线程同步容器,size(),get(),remove()都是被synchronized修饰的,为什么会有线程安全问题呢?...总结 同步容器采用synchronized进行同步,因此执行的性能会受到影响,并且同步容器也并不一定会做到线程安全。 [wx.jpg]

    75600

    Java虚拟机--虚拟机内存区域Java虚拟机内存区域

    Java虚拟机内存区域 Java程序在JVM虚拟机中运行,当我们一个类被加载到虚拟机中时,JVM会给该类分配具体的内存空间/内存地址,而这被分配的区域就是Java虚拟机运行时内存区域。...虚拟机开始启动,Java虚拟机通过类加载器加载xxx.class字节码文件,加载完毕之后(加载过程后续会讲到),再交由Java虚拟机的执行引擎进行实际的运行。...根据《Java虚拟机规范(Java SE 7版本)》的规定,Java虚拟机所管理的内存包括如下几个Java运行时候数据区域: ?...在《Java虚拟机规范(Java SE 7版本)》中,Java虚拟机栈可以被设计成固定大小或者随着程序的执行动态扩展和收缩的形态。...Java虚拟机堆 在Java虚拟机中,Java虚拟机堆是各个线程中共享的内存区域,也是我们Java程序中新建的对象数数组锁分配内存的区域。

    2.1K80

    Java虚拟机

    scope=mdnice] 简述JVM内存模型 线程私有的运行时数据区: 程序计数器、Java 虚拟机栈、本地方法栈。 线程共享的运行时数据区:Java 堆、方法区。...简述虚拟机Java 虚拟机栈用来描述 Java 方法执行的内存模型。线程创建时就会分配一个栈空间,线程结束后栈空间被回收。...简述本地方法栈 本地方法栈与虚拟机栈作用相似,不同的是虚拟机栈为虚拟机执行 Java 方法服务,本地方法栈为本地方法服务。...可以将虚拟机栈看作普通的java函数对应的内存模型,本地方法栈看作由native关键词修饰的函数对应的内存模型。...这部分内存不是虚拟机管理,而是由操作系统来管理。 Java通过通过DriectByteBuffer对其进行操作,避免了在 Java 堆和 Native堆来回复制数据。

    88800

    Java虚拟机

    一、概述 虚拟机的类加载机制 :Java虚拟机把描述类的数据从Class文件加载到内存,并对数据进行校验、转换解析和初始化,最终形成可以被虚拟机直接使用的Java类型,这个过程被称作虚拟机的类加载机制...虚拟机外部的 二进制字节流 就按照虚拟机所设定的格式 存储在方法区之中 了,方法区中的数据存储格式完全由虚拟机实现自行定义,《Java虚拟机规范》未规定此区域的具体数据结构。...直到 初始化阶段 ,Java虚拟机才 真正开始执行类中编写的Java程序代码 ,将主导权移交给 应用程序 。...因此在Java虚拟机中第一个被执行的()方法的类型肯定是java.lang.Object。...Java虚拟机必须保证一个类的()方法在多线程环境中被正确地加锁同步 同一个类加载器下,一个类型只会被初始化一次 四、类加载器 类加载阶段 :通过一个类的全限定名来获取描述该类的二进制字节

    62820

    Java虚拟机

    1、Java虚拟机是什么 “Java虚拟机“可以指三种不同的东西 抽象规范 一个具体的实现 一个运行中的虚拟机实例 当运行一个Java程序的同时,也就是在运行一个Java虚拟机实例 2、Java虚拟机的生命周期...当启动一个Java程序时,一个虚拟机实例也就诞生了,当该程序关闭退出时,这个虚拟机实例也就随之消亡。...在java虚拟机内部有两种线程:守护线程和非守护线程。当该程序中所有的非守护线程都终止时,虚拟机实例将自动退出。 3、Java虚拟机的体系结构 ?...堆中其他数据: 1、对象锁,用于协调多个线程访问一个对象时的同步。 2、等待集合 3、与垃圾收集器有关的数据。 4、方法表:加快了调用实例方法时的效率。...3.6Java栈 每当启动一个线程时,Java虚拟机都会为它分配一个Java栈,Java栈也帧为单位保存线程的运行状态,虚拟机只会直接对Java栈执行两种操作:以帧为单位的压栈和出栈。

    1.2K100

    java虚拟机

    Java 虚拟机栈 每个 Java 方法在执行的同时会创建一个栈帧用于存储局部变量表、操作数栈、常量池引用等信息。...正因为循环引用的存在,因此 Java 虚拟机不使用引用计数算法。...Java 虚拟机使用该算法来判断对象是否可被回收,在 Java 中 GC Roots 一般包含以下内容: 虚拟机栈中局部变量表中引用的对象 本地方法栈中 JNI 中引用的对象 方法区中类静态属性引用的对象...虚拟机会保证一个类的 () 方法在多线程环境下被正确的加锁和同步,如果多个线程同时初始化一个类,只会有一个线程执行这个类的 () 方法,其它线程都会阻塞等待,直到活动线程执行...,这些类由 Java 实现,独立于虚拟机外部,并且全都继承自抽象类 java.lang.ClassLoader。

    80920

    Java虚拟机

    一、概述 虚拟机的类加载机制 :Java虚拟机把描述类的数据从Class文件加载到内存,并对数据进行校验、转换解析和初始化,最终形成可以被虚拟机直接使用的Java类型,这个过程被称作虚拟机的类加载机制...虚拟机外部的 二进制字节流 就按照虚拟机所设定的格式 存储在方法区之中 了,方法区中的数据存储格式完全由虚拟机实现自行定义,《Java虚拟机规范》未规定此区域的具体数据结构。...直到 初始化阶段 ,Java虚拟机才 真正开始执行类中编写的Java程序代码 ,将主导权移交给 应用程序 。...因此在Java虚拟机中第一个被执行的()方法的类型肯定是java.lang.Object。...Java虚拟机必须保证一个类的()方法在多线程环境中被正确地加锁同步 同一个类加载器下,一个类型只会被初始化一次 四、类加载器 类加载阶段 :通过一个类的全限定名来获取描述该类的二进制字节

    70400

    java之Synchronized同步

    java多线程下如何保证共享数据安全,如何保证数据的顺序访问问题,这就需要我们在书写程序代码时需要关注的一个点,在单体java服务中使用Synchronized关键字保证数据同步也是很常用的一件事情了。...package com.wpw.asyncthreadpool; import lombok.extern.slf4j.Slf4j; import java.util.concurrent.TimeUnit...package com.wpw.asyncthreadpool; import lombok.extern.slf4j.Slf4j; import java.util.concurrent.TimeUnit...我们看下日志信息发现在执行同步方法的时候,普通方法也在执行,所以同一个实例对象在调用同步方法的时候不影响普通方法的调用执行过程。...这种模拟我们在这里就不介绍了,其实你明白类和对象之间的关系,其实很容易写出这种模拟效果的,接下来我们还是看下synchronized关键字是如何保证在同步代码块和同步方法保证同步的了。

    62911

    Java虚拟机和Dalvik虚拟机的区别java虚拟机和Dalvik虚拟机的区别

    很多人认为Dalvik虚拟机是一个Java虚拟机,因为Android的编程语言恰恰就是Java语言。...但是这种说法并不准确,因为Dalvik虚拟机并不是按照Java虚拟机的规范来实现的,两者并不兼容;同时还要两个明显的不同: Java虚拟机运行的是Java字节码,而Dalvik虚拟机运行的则是其专有的文件格式...在Java SE程序中的Java类会被编译成一个或者多个字节码文件(.class)然后打包到JAR文件,而后Java虚拟机会从相应的CLASS文件和JAR文 件中获取相应的字节码;Android应用虽然也是使用...虚拟机和Dalvik虚拟机的区别: java虚拟机 Dalvik虚拟机 java虚拟机基于栈。 ...基于栈的机器必须使用指令来载入和操作栈上数据,所需指令更多更多 dalvik虚拟机是基于寄存器的 java虚拟机运行的是java字节码。

    2.5K90

    Java 虚拟机:什么是 Java

    Java虚拟机HotSpot、Java编译器Javac、JNI等等,源代码都在里面。...为什么Java可以实现所谓的“一次编写,到处运行”,主要是因为虚拟机的存在。Java虚拟机负责Java程序设计语言的安全特性和平台无关性。...Java虚拟机屏蔽了与具体操作系统平台相关的信息,使得Java语言编译器只需要生成在Java虚拟机上运行的字节码,就可以在多种平台上不加修改地运行。...Java虚拟机使得Java摆脱了具体机器的束缚,使跨越不同平台编写程序成为了可能。...要多提一句,我们现在说的Java虚拟机基本上都是JDK自带的虚拟机HotSpot,这款虚拟机也是目前商用虚拟中市场份额最大的一款虚拟机,可以通过在命令行程序中输入“java -version”来查看。

    1.6K40

    Java 虚拟机Java内存模型

    文章收录地址:Java-Bang 专注于系统架构、高可用、高性能、高并发类技术分享 JVM 虚拟机.jpg 我们先来看一个反常识的例子。...在多线程环境下,假设这两个方法分别跑在两个不同的线程之上,如果 Java 虚拟机在执行了任一方法的第一条赋值语句之后便切换线程,那么最终结果将可能出现(0,0)的情况。...而且,Java 语言规范将其归咎于应用程序没有作出恰当的同步操作。...强制刷新写缓存,将使得当前线程写入 volatile 字段的值(以及写缓存中已有的其他内存修改),同步至主内存之中。...实际上,在解锁时,Java 虚拟机同样需要强制刷新缓存,使得当前线程所修改的内存对其他线程可见。 需要注意的是,锁操作的 happens-before 规则的关键字是同一把锁。

    1.6K30

    Java】基础04:Java虚拟机

    电脑双系统,沙盒游戏双开,以这两个例子,我们可以引出今天需要学习的一个概念——虚拟机。 当然它们之间还是有着一定的区别的,这次不展开讲述,随着今后的学习,我会将其做一个整理。...若是初次接触虚拟机这个概念,就可以按照上述两个例子来理解,毕竟他们在作用上是有着一定的相似度的。 虚拟机是虚拟出来的计算机,使用虚拟机软件可以在自己的计算机上虚拟出多个计算机 。...一、JVM(Java Virtual Machine ) JVM就是Java虚拟机,它是运行所有Java程序的假想计算机,是Java程序的运行环境。 这是Java 最具吸引力的特性之一,跨平台特性。...当然有一点需要注意: Java虚拟机本身不具备跨平台功能的,每个操作系统需要下载对应的虚拟机,用Java编写的任何程序才能在任何平台上都能运行,不用做修改。...JVM就是上面说到的Java虚拟机,那什么是核心类库? Java自带很多实用的包,这些包中定义了很多类库,可以很方便地进行代码重用 。

    68530

    Java虚拟机简介

    ● JVM屏蔽了与具体操作系统平台相关的信息,使得Java程序只需生成在Java虚拟机上运行的目标代码(字节码),就可以在多种平台上不加修改地运行。 ● Java虚拟机实例负责运行一个Java程序。...当启动一个Java程序时,一个虚拟机实例就诞生了。当程序结束,这个虚拟机实例也就消亡。...在 Java虚拟机规范中,一个虚拟机实例的行为是分别按照子系统、内存区、数据类型和指令来描述的,这些组成部分一起展示了抽象的虚拟机的内部体系结构。...● Java虚拟机Java语言并没有必然的联系,他只与特定的二进制文件格式—Class文件格式所关联,Class文件中包含了Java虚拟机指令集(或者称为字节码,Bytecodes)和符号表,还有一些其他辅助信息...JVM至关重要,正是因为它有针对不同平台的虚拟机,其向上屏蔽了操作系统的差异,使得Java语言编译程序只需生成在Java虚拟机上运行的目标代码(字节码),就可以在多种平台上不加修改地运行。

    43040

    Java虚拟机:什么是Java

    Java虚拟机HotSpot、Java编译器Javac、JNI等等,源代码都在里面。...为什么Java可以实现所谓的“一次编写,到处运行”,主要是因为虚拟机的存在。Java虚拟机负责Java程序设计语言的安全特性和平台无关性。...Java虚拟机屏蔽了与具体操作系统平台相关的信息,使得Java语言编译器只需要生成在Java虚拟机上运行的字节码,就可以在多种平台上不加修改地运行。...Java虚拟机使得Java摆脱了具体机器的束缚,使跨越不同平台编写程序成为了可能。...要多提一句,我们现在说的Java虚拟机基本上都是JDK自带的虚拟机HotSpot,这款虚拟机也是目前商用虚拟中市场份额最大的一款虚拟机,可以通过在命令行程序中输入“java -version”来查看:

    91320
    领券