第十三章 线程安全和锁优化
线程安全:当多个线程访问一个对象时,如果不用考虑这些线程在运行时环境下的调度和交替执行,也不需要进行额外的同步,或者在调用
方进行任何其他的协调操作,调用这个对象的行为都可以获得正确的结果,那这个对象是线程安全的
java中的线程安全
各种操作共享的数据分为以下五类
1) 不可变 不可变对象一定是线程安全的,String,常用枚举类,Long和Double等数值的包装类型,BigInteger,Bigdecimal等;AtomicInteger,AtomicLong并非不可变对象
2)绝对线程安全
3)相对线程安全 java.util.Vector,HashTable,Collections的synchronizedCollection()方法包装的集合
4)线程兼容 对象本身并不是线程安全的,但是可以通过调用端正确的使用同步手段来保证对象在并发情况可以安全的使用
5)线程对立 无论调用端采用同步措施,would无法在多线程环境中并发使用的代码,如System.setIn(),System.setOut();
线程安全的实现方法
1)互斥同步(阻塞同步)
临界区,互斥量,信号量是主要的互斥的实现方式
最常用的互斥手段,synchronized
J.U.C下的ReentrantLock
ReentrantLock 比synchronized 多一些功能
1)等待可中断 当持有锁的线程长期不释放锁的时候,正在等待的线程可以选择放弃等待,改为处理其他事情,可中断特性对处理执行时间非常长的同步快很有帮组
2)可实现公平锁 多个线程在等待同一个锁时,必须按照申请锁的时间顺序来依次获得锁
3)锁可以绑定多个条件 一个ReentrantLock 绑定多个Conditiion
所以1.6之后提倡使用synchronized,对它进行了优化
2) 非阻塞同步
基于冲突检测的乐观并发策略,就是先进行操作,如果没有其他线程争用共享数据,那操作就成功了;如果共享数据有争用,产生了冲突,那就采取其他措施(不断的尝试,直到成功为止)
CAS compare and Swap 比较并交换
如果在这段期间,它的值曾经被改变成了B,后来又被改回A,那CAS操作就会认为它没有改变 CAS的“ABA”问题
3) 无同步方案
可重入代码
线程本地存储
锁优化
1) 自旋锁和自适应自旋
自旋锁:让线程执行一个忙循环(自旋)
-XX:+UseSpinning 来开启,默认关闭
2)锁消除
虚拟机即时编译器在运行时,对一些代码上要求同步,但是被检测到不可能存在共享数据竞争的锁进行消除
3)锁粗化
就是加的锁太多,将加锁同步的范围扩展到整个操作序列的外部
4)轻量级锁
传统锁时重量级的,轻量级时指在没有多线程竞争的前提下,减少传统的重量级锁使用操作系统互斥量产生的性能消耗
无竞争的情况下使用CAS 去消除同步使用的互斥量
5)偏向锁
无竞争的情况下把整个同步都消除掉,连CAS操作都不用做了
相关推荐
作者以易于理解的方式深入揭示了java虚拟机的内部工作原理,深入理解这些内容,将对读者更快速地编写更高效的程序大有裨益! 本书共分20章,第1-4章解释了java虚拟机的体系结构,包括java栈、堆、方法区、执行...
《深入JAVA虚拟机第二版》是一本专注于Java虚拟机(JVM)的权威指南,针对JVM的深入了解和优化提供了详尽的解析。这本书对于Java开发者、系统管理员以及对Java性能调优感兴趣的读者来说,是不可或缺的参考资料。下面...
第13章 逻辑运算 第14章 浮点运算 第15章 对象和数组 第16章 控制流 第17章 异常 第18章 finally子句 第19章 方法的调用与返回 第20章 指令invokespecial 第21章 线程同步 附录A 按操作码助记符排列的指令集 附录B ...
《深入理解Java虚拟机》是Java开发者深入了解JVM(Java Virtual Machine)的必备经典书籍,其第二版提供了原代码分析,帮助读者更直观地理解JVM的工作原理。这本书的各个章节涵盖了从内存管理到垃圾回收,从类加载...
《深入Java虚拟机源码》一书主要涵盖了Java虚拟机(JVM)的内部工作原理,...通过对这些章节的学习,读者将能够深入理解Java虚拟机的工作原理,更好地进行性能优化和问题定位,从而提升Java应用程序的稳定性和效率。
第5-20章深入描述了Java技术的内部细节,包括垃圾收集、Java安全模型、Java的连接模型和动态扩展机制、class文件、运算及流程控制等等,其中第6章和附录A-C安全可以作为class文件和指令集的参考手册。 前言 第1章 ...
根据提供的信息,我们可以总结出以下关于《深入Java虚拟机》这本书的关键知识点: ### 书籍概述 本书名为《深入Java虚拟机》,由Bill Venners撰写,是一本详细讲解Java虚拟机内部工作原理的专业书籍。该书主要分为...
深入java虚拟机第二版 第1章 Java体系结构介绍 1.1 为什么使用Java 1.2 网络带来的挑战和机遇 1.3 体系结构 1.3.1 Java虚拟机 1.3.2 类装载器的体系结构 1.3.3 Java class文件 1.3.4 Java API 1.3.5 ...
第5章 Java虚拟机 第6章 Java class文件 第7章 类型的生命周期 第8章 连接模型 第9章 垃圾收集 第10章 栈和局部变量操作 第11章 类型转换 第12章 整数运算 第13章 逻辑运算 第14章 浮点运算 第15章 对象和数组 第16...
《深入JAVA虚拟机第二版》是一部深度探讨Java虚拟机(JVM)的权威著作,它为开发者揭示了Java程序运行的底层机制,帮助读者理解并优化Java应用性能。本资源包含该书的第二版部分内容,分为了六个部分,分别是:part...
第13节Java虚拟机-ExactVM00:03:35分钟 | 第14节Java虚拟机-HotSpotVM00:04:23分钟 | 第15节Java虚拟机-kvm00:03:04分钟 | 第16节Java虚拟机-JRockit00:04:12分钟 | 第17节Java虚拟机-j900:04:23分钟 | 第18节...
第13章 逻辑运算 13.1 逻辑操作码 13.2 一个模拟:“Logical Results” 13.3 随书光盘 13.4 资源页 第14章 浮点运算 14.1 浮点数 14.2 Inner Float:揭示Java float类型内部 性质的applet 14.3 浮点...
《深入Java虚拟机(第二版)》是一本深入解析Java平台核心技术的重要著作,它详细阐述了Java虚拟机(JVM)的工作原理和技术细节。这本书旨在帮助开发者更好地理解Java程序的运行机制,提升性能优化和故障排查的能力...
自1999年第二版发布以来,历经十余年,《Java虚拟机规范》在2011年7月迎来了针对Java SE7的重大更新,标志着JVM发展的重要里程碑。 #### 二、重要性 ##### 1. 统一性与兼容性 《Java虚拟机规范》作为一份契约文档...
第13章 逻辑运算 13.1 逻辑操作码 13.2 一个模拟:“Logical Results” 13.3 随书光盘 13.4 资源页 第14章 浮点运算 14.1 浮点数 14.2 Inner Float:揭示Java float类型内部性质的applet 14.3 浮点...
《Java虚拟机高级特性与最佳实践》是一本深入解析Java虚拟机(JVM)的权威著作,尤其在第二版中,作者对JVM的高级特性进行了详尽的阐述,并提供了丰富的最佳实践指导。这本书对于想要深入理解Java平台的开发者来说,...
第13章 线程安全与锁优化 13.1 概述 13.2 线程安全 13.2.1 Java语言中的线程安全 13.2.2 线程安全的实现方法 13.3 锁优化 13.3.1 自旋锁与自适应自旋 13.3.2 锁消除 13.3.3 锁粗化 13.3.4 轻量级锁 13.3.5...
线程状态的转换主要是由Java虚拟机(JVM)调度和线程API的使用来决定的。 1. 新建(New):当通过`new Thread()`创建一个新的线程对象时,线程处于新建状态。 2. 可运行(Runnable):调用`start()`方法后,线程...