多线程高并发之synchronized锁及其膨胀

author author     2023-05-04     385

关键词:

参考技术A 在并发编程中,synchronized锁因其使用简单,在线程间同步被广泛应用。下面对其原理及锁升级过程进行探究。

当实例方法被synchronized修饰时,通过当前实例调用此方法的所有线程共用一把锁,不同对象调用此方法线程间互不影响。

当使用synchronized锁修饰实例方法,锁添加在当前类的实例上,有多少个实例可添加多少把锁。

修饰代码块比修饰方法颗粒度更小。当实例方法代码块被synchronized修饰时,通过当前实例调用此方法的所有线程共用一把锁,不同对象调用此方法线程间互不影响。

当使用synchronized锁修饰代码块,锁添加在当前类的实例上,有多少个实例可添加多少把锁。

当静态方法被synchronized修饰时,整个JVM所有调用此方法的线程均受同一个锁的约束。

当使用synchronized锁修饰静态方法,锁添加在当前类的类对象上,最多添加一把锁。

Java 8所使用的synchronized锁是经过优化后的,存在偏向锁、轻量级锁、重量级锁等状态。

线程间不存在锁的竞争行为,至多只有一个线程有获取锁的需求,常见场景为单线程程序。

判断是不是偏向锁的标识是查看调用此方法的线程是否有且仅有一个。

在多线程编程里,被锁修饰的方法仅被单一线程调用几乎不存在,因此偏向锁比较鸡肋:如果能够明确单一线程调用目标方法,使用无锁编程更为合适。

无锁与偏向锁的性能差异非常接近,几乎可以忽略不计。

线程间存在锁的伪竞争行为,即同一时刻绝对不会存在两个线程申请获取锁,各线程尽管都有使用锁的需求,但是是交替使用锁。

当有两个及以上线程调用被锁修饰的方法时,那么至少能确定是轻量级锁。

轻量级锁由于同一时刻不存在两个线程互相竞争锁,因此不存在线程阻塞-唤醒的上下文切换,因此性能相对重量级锁要高很多。

线程间存在锁的实质性竞争行为,线程间都有获取锁的需求,但是时间不可交错,互斥锁的阻塞等待。

当能够肯定至少有两个及以上线程调用被锁修饰的方法时,线程调用方法是随机的,那么大概率是重量级锁。

重量级锁由于涉及到线程阻塞-唤醒的上下文切换,造成相比较与无锁状态,效率低很多。

synchronized锁是非公平锁,没有FIFO队列机制保障竞争锁的线程一定有几率获得锁。

synchronized锁是可重入锁,可重入意味着嵌套调用不会产生死锁问题。

synchronized锁是一种悲观锁,通过加锁实现线程间同步。

在多线程环境下,如果使用synchronized锁,那么大概率会升级到重量级锁。偏向锁和轻量级锁非刻意为之,很难存在,更大的意义是对比帮助理解重量级锁的性能。

重量级锁尽管会对性能产生很大影响,但是依旧是解决线程间同步的有效手段。

当被锁修饰的方法或者代码块执行时间较长时,选用基于线程阻塞-唤醒切换上下文的方式进行线程同步效率相对较高。

当被锁修饰的方法或者代码块执行时间较短时,应选用其它替代锁,比如自旋锁等。

在实际多线程场景开发中,synchronized锁大概率会升级到重量级锁,因其单向升级的特点,重量级状态的synchronized锁可能会对实际业务的并发产生不利影响,手动选用其它锁可能会更合适。

synchronized锁仅可用于解决同一进程内不同线程间同步,对于分布式项目跨进城线程同步依赖于分布式锁,synchronized锁更多的意义是理解锁的过程。

一文看透java高并发:synchronized锁的性质原理及其缺陷

前置知识了解Java基本语法了解多线程基本知识知识介绍Synchronized简介:作用、地位、不控制并发的后果两种用法:对象锁和类锁多线程访问同步方法的7种情况:是否是static、Synchronized方法等Synchronized的性质:可重入、不可中断... 查看详情

juc并发编程--synchronized原理进阶之轻量级锁&锁膨胀(代码片段)

...来优化。轻量级锁对使用者是透明的,即语法仍然是synchronized(也就是在给对象加锁的时候,优先考虑使用轻量级锁去加锁,如果轻量级级锁加锁失败, 查看详情

java开发之高并发必备篇——线程安全操作之synchronized

提到并发编程大多数第一时刻想到的就是synchronized同步锁了,synchronized也是面试中问的比较多的一个问题。在之前的文章中我们提到过线程安全的三个特性:原子性、可见性和有序性,并且说到了java中定义了一个关... 查看详情

java开发之高并发必备篇——线程安全操作之synchronized

提到并发编程大多数第一时刻想到的就是synchronized同步锁了,synchronized也是面试中问的比较多的一个问题。在之前的文章中我们提到过线程安全的三个特性:原子性、可见性和有序性,并且说到了java中定义了一个关... 查看详情

java——多线程高并发系列之readwritelock读写锁(代码片段)

...o2(写写互斥)Demo3(读写互斥)写在前面synchronized内部锁与ReentrantLock锁都是独占锁(排它锁),同一时间只允许一个线程执行同步代码块,可以保证线程的安全性,但是执行效率低。ReentrantRea 查看详情

java——多线程高并发系列之synchronized关键字(代码片段)

文章目录:写在前面Demo1(synchronized面对同一个实例对象)Demo2(synchronized面对多个实例对象)Demo3(synchronized面对一个publicstaticfinal常量)Demo4(synchronized同步代码块分别位于实例方法、静态方法中& 查看详情

java高并发与多线程;:synchronized关键字的实现原理

synchronzied关键字应该是Java并发编程中最重要的内容了,甚至没有之一。在JDK6以前,synchronized关键字还代表着一把重量级锁,因此在JUC包里还推出了Lock类来替代synchronized,不过JDK6以后的synchronized经过优化,引入了偏向锁、轻量... 查看详情

java——多线程高并发系列之lockreentrantlock(代码片段)

文章目录:写在前面说说synchronized和Lock的区别?Demo1(先演示一下锁的可重入性)Demo2(ReentrantLock的基本使用)Demo3(使用Lock锁同步不同方法中的代码块)Demo4(ReentrantLock锁的可重入性)Demo 查看详情

《提升能力,涨薪可待》—java并发之synchronized

Synchronized简介线程安全是并发编程中的至关重要的,造成线程安全问题的主要原因:临界资源,存在共享数据多线程共同操作共享数据而Java关键字synchronized,为多线程场景下防止临界资源访问冲突提供支持,可以保证在同一时... 查看详情

多线程编程之synchronized和lock(代码片段)

前言在高并发多线程应用场景中对于synchronized和Lock的使用是很普遍的,这篇文章我们就来进行这些知识点的学习,比如说:公平锁与非公平锁、乐观锁与悲观锁、线程间通信、读写锁、数据脏读等知识内容。目录:1.同步问题的... 查看详情

高并发多线程基础之线程间通信与数据共享及其应用(代码片段)

前言本篇文章主要介绍的是java多线程之间如何通信,协同处理任务,以及数据共享,定时任务处理等操作。多线程之间通信的方式在实际开发过程中多个线程同时操作,有两种情况的,数据共享和线程间协作... 查看详情

java开发之高并发必备篇——lock和reentrantlock

...java面试中,多线程的安全锁的问题其实不仅仅局限于synchronized,还会被问到lock锁以及代表子类ReentrantLock可重入锁。Lock锁介绍从JDK1.5之后,在java.util.concurrent.locks包下提供了另外一种方式来实现线程同步访问,那... 查看详情

3.java多线程学习笔记之共享模型之管程

共享模型之管程3.1.线程共享变量问题分析3.2.synchronized解决方案3.3.方法上的synchronized3.4.线程八锁3.5.变量的线程安全分析3.6.Monitor概念3.7.monitor原理3.8.synchronized原理进阶3.8.1轻量级锁3.8.2锁膨胀3.8.3自旋优化3.8.4偏向锁3.8.5锁消除3.9.... 查看详情

java并发编程:synchronized及其实现原理

...发编程系列:Java并发编程:核心理论 Java并发编程:Synchronized及其实现原理Java并发编程:Synchronized底层优化(轻量级锁、偏向锁)Java并发编程:线程间的协作(wait/notify/sleep/yield/join)Java并发编程:volatile的使用及其原理一、Sy... 查看详情

java多线程和并发,synchronized

...原因2.互斥锁的特性3.锁的类别4.类锁和对象锁的总结七、synchronized1.线程安全的主要原因 2.互斥锁的特性 Java中synchronized锁的不是代码,而是对象3.锁的类别(1)获取对象锁 (2)获取类锁 4.类锁和对象锁的总结&nbs... 查看详情

java多线程与并发:synchronized

...面对的安全问题体现在原子性可见性重排序三个问题上。Synchronized就是Java为我们提供的解决线程安全问题的一把锁。以前我们都叫它重量级锁,是因为以前它的性能相比与其他锁要差很多,而且非常笨重。但是随着JDK1.6中对Synch... 查看详情

java多线程之synchronized线程锁

 1packageorg.study2.javabase.ThreadsDemo.sync;23/**4*@Auther:GongXingRui5*@Date:2018/9/186*@Description:synchronized线程锁7**/8publicclassTicketApp{9publicstaticvoidmain(Stringargs[]){10Ticketticket 查看详情

java——多线程高并发系列之reentrantlock实现(非)公平锁常用方法的举例(代码片段)

文章目录:写在前面Demo1(公平锁与非公平锁)Demo2(intgetHoldCount()返回当前线程调用lock()方法的次数)Demo3(intgetQueueLength()返回正等待获得锁的线程预估数)Demo4(intgetWaitQueueLength(Condition 查看详情