volatile关键字的作用

  1. 所有变量的可见性——仅仅是修改后的值的可见性,不保证并发修改时新值和预期一致。即只保证读,不保证写。
  2. 禁止指令重排序——修饰的变量,读写不会指令重排。如变量isReady被volatile修饰,这两条指令int B = 0isReady=true不会在编译时改变顺序。注意这里是机器级代码的重排序。

多线程的实现

JDK基于具体系统来做的,如内核线程、用户线程、用户线程加轻量进程混合等。

不可变

初始化后就不会改变

  • final修饰
  • String
  • java.lang.Number的部分子类如Long、Double,AtomicInteger和AtomicLong除外

线程安全

如Vector这样的容器,虽然get()、size()、add()等有synchronized关键字,但是实际使用时还是需要额外的同步(可以是针对容器对象本身的synchronized)保障。
原因是,Vector的线程安全,指的是其对应方法不可打断。但是在多线程环境下,多个方法按顺序执行时,仍有可能产生非预期的行为。
举例:对于非空Vector,记为v,多个线程同时执行remove(v.size()-1),有可能发生数组越界。

逃逸分析

(实际是第11章的内容)
运行期优化,判断一个对象是否会逃逸到方法外或其他线程。如果不会逃逸,对应的优化手段:

  • 栈上分配,在栈上分配这个对象
  • 同步消除,去掉这个对象多线程下的同步措施
  • 标量替换,将这个对象拆分成标量(基本数据类型、referrence等)来创建而不是创建这个对象。

《深入理解Java虚拟机》并发(第12~13章)笔记的更多相关文章

  1. 《深入理解Java虚拟机》-----第12章 Java内存模型与线程

    概述 多任务处理在现代计算机操作系统中几乎已是一项必备的功能了.在许多情况下,让计算机同时去做几件事情,不仅是因为计算机的运算能力强大了,还有一个很重要的原因是计算机的运算速度与它的存储和通信子系统速 ...

  2. 深入理解Java虚拟机第三版,总结笔记【随时更新】

    最近一直在看<深入理解Java虚拟机>第三版,无意中发现了第三版是最近才发行的,听说讲解的JDK版本升级,新增了近50%的内容. 这种神书,看懂了,看进去了,真的看的很快,并没有想象中的晦 ...

  3. 深入理解Java虚拟机(第2版) 笔记目录

    本篇为读深入理解Java虚拟机(第2版)一书的笔记目录. Java 运行期数据区 Java 垃圾回收算法 Java 内存分配策略 Java 类文件结构 Java 加载.链接.初始化 Java 类加载器

  4. 读书笔记,《深入理解java虚拟机》,第三章 垃圾收集器与内存分配策略

    要实现虚拟机,其实人们主要考虑完成三件事情: 第一,哪些内存需要回收: 第二,什么时候回收: 第三,如何回收. 第二节,对象已死吗    垃圾收集其实主要是针对java堆里面的数据来说的,传统的垃圾收 ...

  5. 《深入理解java虚拟机》学习笔记之编译优化技术

    郑重声明:本片博客是学习<深入理解Java虚拟机>一书所记录的笔记,内容基本为书中知识. Java程序员有一个共识,以编译方式执行本地代码比解释方式更快,之所以有这样的共识,除去虚拟机解释 ...

  6. 《深入理解java虚拟机》学习笔记之虚拟机即时编译详解

    郑重声明:本片博客是学习<深入理解java虚拟机>一书所记录的笔记,内容基本为书中知识. Java程序最初是通过解释器(Interpreter)进行解释执行的,当虚拟机发现某个方法或代码块 ...

  7. 深入理解java虚拟机-第13章-线程安全与锁优化

    第十三章 线程安全与锁优化 线程安全 java语言中的线程安全 1 不可变.Immutable 的对象一定是线程安全的 2 绝对线程安全 一个类要达到不管运行时环境如何,调用者都不需要额外的同步措施, ...

  8. 深入理解Java虚拟机-如何利用VisualVM对高并发项目进行性能分析

    前面在学习JVM的知识的时候,一般都需要利用相关参数进行分析,而分析一般都需要用到一些分析的工具,因为一般使用IDEA,而VisualVM对于IDEA也不错,所以就选择VisualVM来分析JVM性能 ...

  9. (转)《深入理解java虚拟机》学习笔记9——并发编程(一)

    随着多核CPU的高速发展,为了充分利用硬件的计算资源,操作系统的并发多任务功能正变得越来越重要,但是CPU在进行计算时,还需要从内存读取输出,并将计算结果存放到内存中,然而由于CPU的运算速度比内存高 ...

随机推荐

  1. Thread之模板模式

    我们知道,在实际使用线程的时候,真正的执行逻辑都是写在run方法里面,run方法是线程的执行单元,如果我们直接使用Thread类实现多线程,那么run方法本身就是一个空的实现,如下: /** * If ...

  2. 执行插件的替代方式:用JS调用操作

    关注本人微信和易信公众号: 微软动态CRM专家罗勇 ,回复229或者20161028可方便获取本文,同时可以在第一间得到我发布的最新的博文信息,follow me!我的网站是 www.luoyong. ...

  3. Android8.1源码编译实践(Mac)

    第0步:版本选择 AOSP版本选择很重要,如果选错了,会造成编译失败等各种问题,编译AOSP对Xcode的版本是有要求的: 比如:AOSP6.0-7.0,要求Xcode的版本是8.3,然而在MacOS ...

  4. 一语点醒技术人:你不是 Google(转载)

    转载链接:https://www.infoq.cn/article/2017/06/U-no-Google 在为问题寻找解决方案时要先充分了解问题本身,而不是一味地盲目崇拜那些巨头公司.Ozan On ...

  5. [b0024] python 归纳 (十)_线程 _Thread模块

      #!/usr/bin/pythonn # -*- coding: UTF-8 -*- """ 学习线程 thread 总结: 1. 主线程退出,所有子线程都退出 2. ...

  6. hisi mmz模块驱动讲解

    一.概述 如图所示,在海思平台上将内存分为两个部分:os内存和mmz内存.os内存指:由linux操作系统管理的内存:mmz内存:由mmz驱动模块进行管理供媒体业务单独使用的内存,在驱动加载时可以指定 ...

  7. nginx的共享字典项api(操作方法)

    nginx的共享内存,称为共享字典项,对于所有的worker进程都可见,是一种全局变量. 备注一下内容中的 [] 是 备注. 源码分析文档:https://www.codercto.com/a/948 ...

  8. Python 修饰符@用法

    def funA(desA): print("It's funA") def funB(desB): print(desB( )) print("It's funB&qu ...

  9. postman---postman文件夹介绍以及批量执行用例

    我们在做测试的过程中,都会多次请求接口,都会把接口保存下来,方便下次直接请求,节省时间不用每次都重新输入,我们一起看下Postman如何保存接口会话 保存请求作用 Postman可以将各个请求组合保存 ...

  10. easyui入门

    什么是easyui! easyui=jquery+html4(用来做后台的管理界面) 1.通过layout布局 我们先把该导的包导下 然后就是JSP页面布局 2.通过tree加载菜单 先来一个实体类 ...