Synchronized的底层实现原理,源码深度剖析! mikechen的互联网架构(synchronized源码分析)

  本篇文章为你整理了Synchronized的底层实现原理,源码深度剖析! – mikechen的互联网架构(synchronized源码分析)的详细内容,包含有synchronized原理详解 synchronized源码分析 synchronized的实现原理面试 synchronized怎么实现的 Synchronized的底层实现原理,源码深度剖析! – mikechen的互联网架构,希望能帮助你了解 Synchronized的底层实现原理,源码深度剖析! – mikechen的互联网架构。

   系统掌握 Java 多线程和并发编程的技术原理和知识点,写出优秀的并发代码

   熟练应用各种并发工具,了解在什么情况下使用哪些具体的技术和方法

   分掌握常见的多线程和并发问题分析技巧,知道排查一般问题的具体步骤

   构建完整全面的并发编程知识体系,以及常见的面试问题和技巧

   精通Java并发编程,彻底掌握 Java 并发编程知识。

  详细内容

   操作系统的发展历程

   多线程、纤程、协程

   硬件内存架构

   并发和并行

   CPU和高速缓存

   缓存一致性

   指令重排

   支撑Java内存模型原理

   Volatile的实现源码剖析

   内存屏障

   经典的单例的双重检测源码剖析

   AQS的设计和结构

   AQS源码深度剖析

   线程通信与状态流转

   Synchronized的实现原理及应用

   Synchronized锁的膨胀升级过程分析

   乐观锁、悲观锁、重入锁、公平锁、非公平锁及锁的粒度详解

   ReentrantLock源码深度剖析与实战

   可重入锁原理、获取锁和释放锁

   ReentrantReadWriteLock源码深度剖析与实战

   Condition 条件队列

   线程池核心原理

   线程池核心参数、拒绝策略、任务流程详解

   线程池ThreadPollExecutor

   阻塞与非阻塞队列详解

   CountDownLatch源码深度剖析与实战

   Semaphore源码深度剖析与实战

   CyclicBarrier源码深度剖析与实战

   ArrayBlockingQueue源码深度剖析

   ConcurrentLinkedQueue 源码深度剖析

   PriorityBlockingQueue 源码深度剖析

   并发Atomic原子

   死锁解决方案

   CAS算法乐观锁

   CAS的ABA问题

   ThreadlLocal源码深度解析

   ThreadlLocal数据隔离

   ThreadlLocal内存溢出

   ForkJoin原理解析

  
ConcurrentHashMap JDK1.8源码剖析

   ArrayList、LinkedList、CopyOnWriteArrayList的实现原理

   阻塞队列的实现原理与应用

   非阻塞队列的实现原理与应用

   ConcurrentLinkedQueue源码深度剖析

   ArrayBlockingQueue源码深度剖析

   深入LinkedBlockingQueue实现原理

  反射泛型

  
从 0 掌握消息队列(MQ)的关键技术,了解核心知识

   全面了解各类 MQ 技术的原理和特性,洞悉相关原理

   深入理解 MQ 的特点和应用场景

   掌握RabbitMQ RocketMQ Kafaka架构设计

   全面吃透RocketMQ的源码底层实现

  

  详细内容

   消息队列的设计

   消息队列的核心组成

   消息队列的传输模式

   消息队列的消费模式

   消息队列的消息协议

   消息队列的发送方式

   消息队列的应用

   异步调用的实现原理

   应用解耦的实现原理

   削峰填谷的实现原理

   消息队列的架构与选型

   Kafka的核心架构设计

   RabbitMQ的核心架构设计

   RocketMQ的核心架构设计

   主流消息队列的选型与优劣比较

   如何设计一个消息队列

   消息队列的整体架构

   消息队列的核心流程

   消息队列传输过程

   消息队列如何数据存储

   消息队列如何做消息消费

   同步异步编程

   同步编程的实现

   异步编程的实现

   Future的源码剖析

   同步、异步源码案例讲解

   RocketMQ零拷贝

   RocketMQ Mmap的实现

   PageCache

   Mmap的底层实现原理

   虚拟内存

   缺页中断

   RocketMQ源码深度剖析

   RocketMQ异步通信

   RocketMQ核心存储

   RocketMQ消费队列

  
精通分布式事务并对其原 理有深入理解

   精通分布式锁、Session、全局唯一ID等并对其原 理有深入理解

   掌握分布式数据库并对原理有深入理解

   全面了解分布式的协议

   全面了解分布式存储方案

  

  详细内容

   微服务架构变迁史

   淘宝分布式架构演变过程

   分布式协议

   一致性模型

   Gossip协议

   Paxos协议

   Raft协议

   Zab协议

   分布式Session解决方案

   session

   分布式session

   分布式session方案

   Session复制

   Session存储在Cookie

   Session粘性管理

   Session集中管理在后端

   分布式Session方案优劣势比较

   分布式事务解决方案

   分布式事务

   BASE

   一致性模型

   XA两阶段

   事务补偿TCC

   消息队列最终一致性

   分布式锁解决方案

   分布式锁的由来

   分布式锁的特点

   分布式锁解决方案

   数据库分布式锁

   Redis分布式锁

   Zookeeper分布式锁

   分布式锁解决方案优劣势比较

   分布式全局唯一ID

   分布式全局唯一ID的要求

   分布式全局唯一ID的方案

   分布式全局唯一ID方案的优劣势比较

   Snowflake雪花算法详解

   大厂分布式全局唯一ID方案

   分布式关系SQL数据库解决方案

   SQL - NoSQL- NewSQL发展轨迹

   MySQL+分库分表

   Spanner

   Aurora

   NewSQL新型分布式数据库比较

   分布式NoSQL数据库解决方案

   NoSQL的三大基石

   列式数据

   文档数据库

   图形数据库

   内存键值数据库

   主流NoSQL数据库比较

   分布式文件存储解决方案

   FastDFS

   MogileFS

   MooserFS

   GlusterFS

   Ceph

  14:亿级高性能架构设计

  
在Java中,我们经常使用synchronized关键字来解决多线程的同步安全问题。更重要的是在Java面试中,synchronized属于必考点,需要掌握的知识点非常多。

  为了助大家掌握好synchronized,本节课我重点会讲解以下6点:

  1.Synchronized

  2.Synchronized方法锁、对象锁、类锁

  3.Synchronized的源码实现

  4.Synchronized的实现原理

  5.Monitor对象详解

  6.Synchronized的锁存储位置

  目录

  SynchronizedSynchronized的三种使用方式Synchronized的源码实现Synchronized的实现原理Synchronized的锁存储位置

  Synchronized

  Synchronized翻译为中文的意思是同步,也称之为”同步锁“,Synchronized关键字是java并发编程中必不可少的工具,它一次只允许一个线程进入特定代码段,从而避免多线程同时修改同一数据。

  Synchronized的作用

  在并发编程中存在线程安全问题,主要原因有:
 

  1.存在共享数据
 

  2.多线程共同操作共享数据

  关键字synchronized可以保证在同一时刻,只有一个线程可以执行某个方法或某个代码块,同时synchronized可以保证一个线程的变化可见(可见性),即可以代替volatile。

  Synchronized的三种使用方式

  Java中每一个对象都可以作为锁,这是synchronized实现同步的基础:

  1.普通同步方法(实例方法):锁是当前实例对象 ,进入同步代码前要获得当前实例的锁。

  

/**

 

  * 用在普通方法

  private synchronized void synchronizedMethod() {

  System.out.println("--synchronizedMethod start--");

  try {

  Thread.sleep(2000);

  } catch (InterruptedException e) {

  e.printStackTrace();

  System.out.println("--synchronizedMethod end--");

  }

 

  2.静态同步方法:锁是当前类的class对象 ,进入同步代码前要获得当前类对象的锁。

  

/**

 

  * 用在静态方法

  private synchronized static void synchronizedStaticMethod() {

  System.out.println("synchronizedStaticMethod start");

  try {

  Thread.sleep(2000);

  } catch (InterruptedException e) {

  e.printStackTrace();

  System.out.println("synchronizedStaticMethod end");

  }

 

  3.同步方法块:锁是括号里面的对象,对给定对象加锁,进入同步代码库前要获得给定对象的锁。

  

/**

 

  * 用在类

  private void synchronizedClass() {

  synchronized (SynchronizedTest.class) {

  System.out.println("synchronizedClass start");

  try {

  Thread.sleep(2000);

  } catch (InterruptedException e) {

  e.printStackTrace();

  System.out.println("synchronizedClass end");

  }

 

  Synchronized的源码实现

  

package com.mikechen.concurrent.lock;

 

  public class SynchronizedAnalysis {

  public synchronized void test1(){

  System.out.println("welcome to mikechen");

  public void test2(){

  synchronized (this){

  System.out.println("welcome to mikechen");

  }

 

  反编译后
 

  1、同步方法

  使用ACC_SYNCHRONIZED标记符隐式的实现

  2.同步代码块

  monitorenter(获取锁)、monitorexit(释放锁)
 

  两者虽然实现细节不同,但本质上都是对一个对象的监视器(monitor)的获取

  Synchronized的实现原理

  1.同步方法

  方法级的同步是隐式的,无须通过字节码指令来控制,JVM可以从方法常量池的方法表结构中的ACC_SYNCHRONIZED访问标志得知一个方法是否声明为同步方法。

  当方法调用的时,调用指令会检查方法的ACC_SYNCHRONIZED访问标志是否被设置

  如果设置了,执行线程就要求先持有monitor对象,然后才能执行方法,最后当方法执行完(无论是正常完成还是非正常完成)时释放monitor对象。

  在方法执行期间,执行线程持有了管程,其他线程都无法再次获取同一个管程。

  2.同步代码块

  同步代码块,synchronized关键字经过编译之后,会在同步代码块前后分别形成monitorenter和monitorexit字节码指令

  在执行monitorenter指令的时候,首先尝试获取对象的锁

  如果这个锁没有被锁定或者当前线程已经拥有了那个对象的锁,锁的计数器就加1

  在执行monitorexit指令时会将锁的计数器减1,当减为0的时候就释放锁。

  如果获取对象锁一直失败,那当前线程就要阻塞等待,直到对象锁被另一个线程释放为止。

  Monitor对象详解

  
 

  Count用来记录该线程获取锁的次数

  Entry List:那些有资格成为候选人的线程被移到Entry List

  Wait Set:那些调用wait方法被阻塞的线程被放置到Wait Set

  Owner:获得锁的线程称为Owner

  Synchronized的锁存储位置

  
这节课就先讲到这里,后面一节课我会重点去讲解Synchronized的锁的详细升级过程(这也是大厂经常面试的考点)。

  
synchronized是java提供的一个同步锁的关键字,java使用这个关键字来实现对代码块的加锁操作,从而保证在多线程的情况下只有一个线程能访问到被synchronized包住的代码块。
 

  synchronized根据使用位置的不同分为普通方法锁,静态方法锁和代码块锁,锁的对象分别是当前实例对象,当前类对象和自定义对象。
 

  虽然synchronized使用位置不同,但是底层的实现都是通过获取对象的监视器monitor来实现,在被synchronized标记的代码前后,会插入monitorenter和monitorexit指令。monitorenter会让当前线程获取用户对象的锁,如果获取成功,monitor的计数器就+1,这样别的线程就无法再获取到锁,当前线程执行sychronized的代码块,执行完成代码后会执行monitorexit,将monitor的计数器-1,当monitor的计数器=0的时候就代表解锁成功,允许别的线程获取锁。

  
synchronized是java的关键字,当它用来修饰一个方法或者代码块的时候,能够保证在同一时刻只有一个线程执行该段代码。JDK1.5之后引入了自旋锁、锁粗化、轻量级锁、偏向锁来优化关键字的性能。
 

  synchronized的底层实现是通过一个monitor的对象来完成,具体的指令有monitorenter和monitorexit。

  
synchronized的锁优化特别重要的,严格来讲顺序是:无锁- 偏向锁- 轻量级锁- 重量级锁,从轻量级锁到重量级锁会涉及到你上面提到的两个核心点:自旋锁与自适应自旋锁,刚好今天我讲了锁的升级,作业也提到了这点,回头可以作业输出后,你会有新的收获,路正银加油 ✗拳头✗

  
synchronized是同步锁,有三种使用方法,包括普通方法、静态方法、以及代码块锁对象。
 

  普通方法锁当前对象,静态方法锁当前类对象,代码块锁指定的对象。
 

  锁方法底层实现是用了一个acc同步标志位来标志该方法是否加锁,代码块锁是在代码块前面和后面加了moniterenter,moniterexit指令。
 

   虽然这两种方法实现有差异,但本质都是去获取一个moniter对象,获取到锁后,moniter对象的计数器加1,释放后,减一,如果变为0,代表锁已经完全释放,支持锁重入。

  每个对象包括对象头、实例数据、对齐填充。其中对象头里的标记字段包含了锁的相关信息

  
核心点都谈到了,synchronized的底层实现还有一个非常关键的点就是:锁的升级与优化,这个也是经常考察的点,刚好今天我讲到了这点,回头再把这个点补下就更好了 ✗咧嘴笑✗

  以上就是Synchronized的底层实现原理,源码深度剖析! – mikechen的互联网架构(synchronized源码分析)的详细内容,想要了解更多 Synchronized的底层实现原理,源码深度剖析! – mikechen的互联网架构的内容,请持续关注盛行IT软件开发工作室。

郑重声明:本文由网友发布,不代表盛行IT的观点,版权归原作者所有,仅为传播更多信息之目的,如有侵权请联系,我们将第一时间修改或删除,多谢。

留言与评论(共有 条评论)
   
验证码: