您现在的位置是:网站首页> 新闻快讯> 软件使用 新闻快讯

jdk1 8 64位

小玉2023-07-05软件使用 252人已围观

简介基于GNUv2协议的JDK16版本发布,此次发布的有Linux/AArch64,Linux/x64,macOS/x64,Windows/x64版

jdk1 8 64位

最后更新:2023-07-05 01:54:47

推荐指数

基于GNUv2协议的JDK16版本发布,此次发布的有Linux/AArch64,Linux/x64,macOS/x64,Windows/x64版本。网址:网页链接甲骨文也发布了非开源的版本,可以在网页链接此版本开发使用了一些新的特性,部分如下:-VerctorAPI(新功能测试)-启用C++14特性-从Mercurial迁移到Git-迁移到了github-使用ZGC并发线程堆栈处理-Unix域套接字通道-AlpineLinux端口-弹性元空间-支持Windows/AArch64端口-外部链接程序API(新功能测试)-基于值的类的警告-打包工具-外部存储器访问API(第三方开发的新功能测试)-instanceof模式匹配-记录-默认情况下在JDK内部用强封装-密封类(新功能迭代)(其中一部分特性我不太懂,翻译不出来[流泪])【java经典面试场景之多线程】请介绍一下synchronized锁升级要搞明白什么是synchronized锁升级,就得先搞清楚什么是synchronized?前面有介绍,可以往前面翻。当我们聊到synchronized的时候,很多人第一反应就是他是一个重量级锁,没错,这也是为什么JDK团队在1.6对synchronized做了大量的优化,其中就包括synchronized的锁升级。对象头,也就是我们经常说到的markWord,而我们的synchronized使用的锁就是存放java对象头中。如果对象是数组类型,则虚拟机用3个字宽存储对象头,如果是非数组类型,则用2字宽存储对象头。在32位虚拟机中,1字宽等于4字节(32bit)。java对象头的长度请看图一。java对象头里的MarkWord默认存储对象的HashCode、分代年龄和锁标记位。32位JVM的MarkWord的默认存储结构图二所示在运行中,MarkWord存储的数据会随着锁标志位的变化而发生变化,具体如图三所示。而64位虚拟机则于32位的MarkWord是有着一些差别的,MarkWord在64位下所占空间为64bit,图四所示。MarkWord搞明白之后我们需要弄明白锁升级中的几个锁状态:无锁状态、偏向锁、轻量级锁、重量级锁。无锁状态:顾名思义,没有加锁,这个没啥需要解释的。偏向锁:当一个线程访问同步代码块并获取到锁时,会在对象头(MarkWord)和栈帧中的锁记录里存储锁偏向的线程ID,该线程再次进入和退出同步代码块时不需要进行CAS操作来加锁和解锁,只需要简单的判断一下对象头(MarkWord)里是否存储者指向当前线程的偏向锁。如果是,表示该线程已经获取到了锁。如果不是,则需要再测试一下MarkWord中偏向锁的标志(偏向模式)是否设置为1(表示当前是偏向锁),如果没有,则利用 CAS竞争锁;如果是,则尝试使用CAS将对象头的偏向锁指向当前线程。偏向锁的撤销:偏向锁使用了一种等待竞争才会释放锁的机制,所以偏向锁的撤销只有其他线程尝试竞争偏向锁的时候,只有偏向锁的线程才会释放锁。但需要注意的是:偏向锁的撤销需要一个全局安全点(所有线程都停止执行),它会先暂停持有偏向锁的线程,然后检查持有偏向锁的线程是否处于存活状态,如果该线程处于非活动状态,则立即结束偏向锁,根据锁对象目前是否处于被被锁的状态是否撤销偏向锁,撤销后标志位恢复到无锁状态或者轻量级锁状态。偏向锁可以提高带用同步但无竞争的程序性能,但他同样是一把双刃剑,如果程序中大部分的锁都会被多个线程访问,那偏向锁可能会适得其反,所以需要根据程序的自身条件判断是否需要开启偏向锁。偏向锁在JDK6、7是自动开启的,如果你想关闭偏向锁,只需要将JVM的参数:-XX:-UseBiasedLocking=false,这样程序默认会进入轻量级锁状态。轻量级锁:在线程即将进入同步代码块时,如果此同步对象没有被锁定(锁标志位为‘’01‘’),虚拟机首先会在当前线程的栈帧中建立一个名为锁记录(LockRecord)的空间,利用存储锁对象目前MarkWord的拷贝(官方称之为:DisplacedMarkWord)。随后虚拟机将会使用CAS操作尝试将对象的MarkWord更新为指向LockRecord的指针。如果操作成功,说明当前线程已经拥有了这个对象的锁,并且对象的MarkWord锁标志将会修改为“00”,表示此对象处于轻量级锁定状态,如果失败,那说明至少存在一个线程与当前线程竞争获取该对象的锁。虚拟机会优先检查对象的MarkWord是否指向当前线程的栈帧,如果是:说明线程已经拥有了这个对象的锁,直接执行代码块即可,否则说明对象已经被其他线程占用了,此时轻量级锁会膨胀成为重量级锁(轻量级的加锁)。轻量级的解锁:如果对象的MarkWord还是指向线程的锁记录,则会使用CAS操作将当前对象的MarkWord和线程中复制的DisplacedMarkWord进行替换,替换成功,说明同步过程顺利完成;替换失败,说明其他线程尝试获取过该锁,就需要释放锁的同时,唤醒被挂起的其他线程。轻量级锁的不足:如果长时间得不到锁,CAS操作会频繁的消耗CPU。重量级锁:这个大家也是非常熟悉,所有线程互斥,获取到锁的线程执行,其他线程阻塞被挂起,效率较差。锁升级的流程请看图五。所以撤销偏向锁的时候标志位不一定会变成无锁,也有可能会升级为轻量级锁(存在锁竞争)。偏向锁、轻量级锁、重量级锁的优缺点对比请看图六。

很赞哦! (0)

文章评论

来说两句吧...

验证码: