Java6对synchronized的优化-锁升级过程详细过程

本文详细介绍了Java6中synchronized的优化,包括锁升级过程:无锁->偏向锁->轻量级锁->重量级锁。讨论了锁的状态、Java对象头的MarkWord、以及不同锁状态下的Mark Word内容。强调了锁升级的单向性和适应不同并发场景的重要性。
摘要由CSDN通过智能技术生成

前言

以前我们在复习synchronized的时候,和lock一对比,总说它是一个重量级锁,性能很差,不如lock来的方便,但其实synchronized作为Java中元老级的关键字,很多jdk原始代码都有用到它,因此Java开发团队还是非常中意这个“私生子”的,所以为了给它减重,开发者也早在Java6就为synchronized专门设计了一套优化处理过程。

一、synchronized使用

  1. 加到方法上,锁就是这个对象,防止多个线程同时访问这个对象的synchronized方法;
  2. 加到静态方法,锁就是这个类的class对象,防止多个线程同时访问这个类的synchronized方法,对该类所有对象适用;
  3. 加到代码块,锁就是该代码块所在的对象,防止多个线程同时访问该代码块;

二、JVM对synchronized的实现方式

  1. 代码块同步:通过使用 monitorentermonitorexit 指令实现的
  2. 同步方法:ACC_SYNCHRONIZED 修饰

三、Java对象头(存储锁类型)

了解锁升级之前,必须先知道Java对象头,正式对象头记录的信息才实现了锁升级过程中的线程判断。

Java对象ÿ

  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
### 回答1: 非常感谢您的问题。synchronized锁升级过程Java优化技术之一,它可以减少的竞争,提高程序的执行效率。在Java,每个对象都有一个(也称为内置或监视器),线程在执行同步代码块时会获取该对象的,并在代码块执行完成后释放该。当多个线程同时访问同一个对象的同步代码块时,就会出现竞争的情况,影响程序的执行效率。 在Java6之前,synchronized实现存在较大的性能问题,当多个线程竞争同一个时,会导致线程频繁地进入和退出阻塞状态,增加了线程切换的开销,降低了程序的执行效率。为了解决这个问题,Java6引入了偏向、轻量级和重量级优化技术,并采用锁升级的方式在不同之间进行转换,从而提高程序的执行效率。 具体来说,当一个线程第一次进入同步代码块时,会先尝试获取对象的偏向,如果对象没有被其他线程访问过,那么当前线程会获取到该对象的偏向,并将当前线程ID记录在对象头,以后该线程每次进入同步代码块时都无需重新获取,直接使用偏向即可。如果有其他线程访问了该对象,那么当前线程会尝试将偏向锁升级为轻量级。轻量级是一种自旋,它采用CAS(Compare And Swap)指令来保证线程的原子性,避免了线程阻塞和唤醒的开销。如果当前线程获取轻量级成功,那么就可以在自旋过程执行同步代码,避免了线程阻塞和唤醒的开销。如果轻量级获取失败,那么当前线程就会尝试将轻量级锁升级为重量级,此时当前线程会阻塞等待其他线程释放该对象的,直到获取到重量级才能执行同步代码。 总之,synchronized的升级过程Java优化技术之一,它可以提高程序的执行效率,减少的竞争。 ### 回答2: synchronizedJava用于保证多个线程访问同一个共享资源时的线程安全的关键字。当一个线程想要执行synchronized修饰的同步代码块时,需要先获取对象的,如果被其他线程占用,则当前线程会被阻塞,直到获取到为止。 synchronized锁升级过程分为偏向、轻量级和重量级三个阶段。 首先,在没有竞争的情况下,将被优化为偏向。偏向的作用是,当一个线程获取到时,会在对象的头部标记记录该线程的ID。在下次该线程再次申时,无需再次进行同步操作,直接获取即可。 然后,如果有多个线程竞争同一个,偏向将转为轻量级。这时每个线程都会在自己的线程栈帧保存的副本。线程会通过CAS(比较并交换)来进行的获取和释放,而不再阻塞线程。 最后,如果多个线程仍然竞争同一个,轻量级将升级为重量级。重量级实现是利用操作系统提供的互斥量机制,当一个线程获取后,其他线程将被阻塞,直到持有的线程释放的升级过程在多线程环境下进行,根据的状态切换来提高并发效率。通过合理地选择的类型以及的级别,可以更好地平衡性能与安全性之间的关系。 ### 回答3: synchronized锁升级过程是指在Java保证多线程访问同步代码时的一种优化机制。其主要目的是提高多线程并发访问共享资源时的性能和效率。 当一个线程尝试进入同步代码块时,会先尝试获取对象的无状态。如果成功获取无状态,则可以直接执行同步代码,并将对象标记为偏向。这是的第一级别,也是最轻量级的。如果在此时另一个线程也想要进入同步代码,就会造成竞争。 如果存在竞争,偏向就会升级为轻量级。轻量级是通过在对象头的标识字段记录指向线程栈记录的指针来实现的。如果线程竞争太激烈,轻量级就会升级为重量级。 重量级是指同步代码块被多个线程访问时,会将线程阻塞并等待释放。重量级采用操作系统的互斥量实现,所以比较耗时和耗资源。 在锁升级过程的状态会从无状态到偏向,再到轻量级,最后到重量级。在逐步升级的过程的开销也会逐渐增加。 需要注意的是,在JDK 6之后,引入了消除和膨胀机制消除指的是JVM在编译器优化时发现某些代码分支不存在线程竞争时,会去除相应的操作;膨胀指的是JVM会根据竞争情况,将轻量级锁升级为重量级。 综上所述,synchronized锁升级过程是为了提高多线程并发访问同步代码时的性能和效率。通过从无状态到偏向,再到轻量级,最后到重量级的升级过程,JVM可以根据竞争情况选择最适合的状态,以实现最佳的性能和资源利用。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值