
java并发编程
文章平均质量分 93
csdn_life18
这个作者很懒,什么都没留下…
展开
-
不可不说的Java“锁”事
Java提供了种类丰富的锁,每种锁因其特性的不同,在适当的场景下能够展现出非常高的效率。本文旨在对锁相关源码(本文中的源码来自JDK 8和Netty 3.10.6)、使用场景进行举例,为读者介绍主流锁的知识点,以及不同的锁的适用场景。Java中往往是按照是否含有某一特性来定义锁,我们通过特性将锁进行分组归类,再使用对比的方式进行介绍,帮助大家更快捷的理解相关知识。本文Java中常用的锁以及常见的锁的概念进行了基本介绍,并从源码以及实际应用的角度进行了对比分析。转载 2024-06-08 10:10:12 · 82 阅读 · 0 评论 -
Java 并发编程中的 synchronized 关键字及其现代优化技术
在早期版本的 Java 中,关键字被认为是重量级锁,效率较低,这与其底层实现机制密切相关。要深入理解这个问题,需要结合计算机系统的相关原理,包括操作系统、线程管理、以及用户态和内核态的转换。Java 的 synchronized 关键字在早期版本中被认为是重量级锁,效率较低。这主要是因为 synchronized 依赖于操作系统提供的互斥锁,并且涉及频繁的用户态和内核态转换,导致高昂的性能开销。原创 2024-06-07 21:40:10 · 1075 阅读 · 0 评论 -
深入分析Synchronized原理(阿里面试题)
还有一篇 讲解lock的实现原理,参考:解决多线程安全问题-无非两个方法synchronized和lock 具体原理以及如何 获取锁AQS算法 (百度-美团)记得开始学习Java的时候,一遇到多线程情况就使用synchronized,相对于当时的我们来说synchronized是这么的神奇而又强大,那个时候我们赋予它一个名字“同步”,也成为了我们解决多线程情况的百试不爽的良药。但是,随着学习的进行我们知道在JDK1.5之前synchronized是一个重量级锁,相对于j.u.c.Lock,它会显得.转载 2020-12-29 17:35:24 · 414 阅读 · 0 评论 -
线程及线程池的五种状态
文章目录线程的5种状态1.New (新创建)2.Runnable (可运行/就绪)3.Running (运行中)4.Blocked (等待/阻塞/睡眠)5.Dead (死亡)线程池的五种状态1.RUNNING2.SHUTDOWN3.STOP4.TIDYING5.TERMINATED线程的5种状态线程可以有如下5种状态:New 、Runnable 、Running 、Blocked 、Dead状态之间的转换如图:在这里插入图片描述1.New (新创建)当用new操作符创建一个线程时,如new Th转载 2020-12-28 16:10:50 · 1193 阅读 · 0 评论 -
Condition案例使用及其源码解析
文章目录前言 condition案例-结合ReentrantLock 代码如下 结果展示 结果分析 condition和ReentrantLock源码分析 lock方法 await方法 addConditionWaiter方法 fullyRelease方法 release方法 isOnSyncQueue方法 await方法阻塞线程1完毕,线程2抢锁 线程2通过signal方法主动释放线程1并cas抢占锁 signal方法转载 2020-12-25 15:08:40 · 293 阅读 · 0 评论 -
JVM MarkWord与Lock Record && 锁
文章目录MarkWordLock Record偏向锁轻量级锁重量级锁Linux中的MutexMarkWord翻译过来就是标记字,既然是标记,那么就肯定是用来记录一些信息,x86下4字节,x64下8字节,后面紧跟着klass pointer,目前jvm基本都是x64,我们都知道在x86下地址是4字节大小,在x64下地址是8字节大小,但JAVA默认情况下开启了指针压缩,将8字节指针压缩成4字节,但是内存对齐机制导致无论如何,在x64下这俩加起来后占用的空间都是16字节。还有OopPointer(就是类中还转载 2020-08-03 16:22:10 · 2253 阅读 · 2 评论 -
synchronized重量级锁底层原理
synchronized底层原理对象头要搞清楚Synchronize的底层原理,先了解一下对象头每个对象都会有一个对象头如果这个对象是是数组类型,那么jvm会用3个字宽(32位虚拟机中,1个字宽4个字节)存储对象头,如果是非数组类型,jvm会用2个字宽存储对象头对象头的存储结构如上其中Mark Word中的状态变化又如上图synchronized的宏观实现我们主要来说重量级锁的实现从上面的图也可以看到,当Synchronize升级为重量级锁的时候,会有一个指向互斥量(moni转载 2020-08-02 13:41:00 · 1181 阅读 · 0 评论 -
Java多线程里总线锁定和缓存一致性的问题
随着多核时代的到来,并发操作已经成了很正常的现象,操作系统必须要有一些机制和原语,以保证某些基本操作的原子性,比如处理器需要保证读一个字节或写一个字节是原子的,那么它是如何实现的呢?有两种机制:总线锁定和缓存一致性。下面,尚学堂陈老师简单为大家分享总线锁定和缓存一致性的问题。我们知道,CPU和物理内存之间的通信速度远慢于CPU的处理速度,所以CPU有自己的内部缓存,根据一些规则将内存中的数据读取到内部缓存中来,以加快频繁读取的速度。我们假设在一台PC上只有一个CPU和一份内部缓存,那么所有进程和线...转载 2020-07-30 17:34:29 · 377 阅读 · 0 评论 -
ava锁粗化和锁消除
锁粗化通常情况下,为了保证多线程间的有效并发,会要求每个线程持有锁的时间尽可能短,但是大某些情况下,一个程序对同一个锁不间断、高频地请求、同步与释放,会消耗掉一定的系统资源,因为锁的讲求、同步与释放本身会带来性能损耗,这样高频的锁请求就反而不利于系统性能的优化了,虽然单次同步操作的时间可能很短。锁粗化就是告诉我们任何事情都有个度,有些情况下我们反而希望把很多次锁的请求合并成一个请求,以降低短时间内大量锁请求、同步、释放带来的性能损耗。一种极端的情况如下:public void doSom.转载 2020-07-26 20:57:34 · 143 阅读 · 0 评论