首页 > 其他分享 >synchronized

synchronized

时间:2024-09-08 14:51:35浏览次数:10  
标签:synchronized 竞争 线程 轻量级 重量级 偏向

synchronized

synchronized底层是如何实现的 以及 什么是锁的升级和降级?

synchronized是java内建的一种同步机制,当一个线程已经获取到锁了,其他的线程试图获取锁的时候就只能等待或者阻塞在那里。synchronized可以用来修饰方法也可以用来修饰代码块。

synchronized底层是基于一对monitorenter/monitorexit指令来实现的,我们可以通过反编译.class文件看到这两条指令。

在虚拟机中,java对象在内存中存储在堆中,堆中的对象可以分为3个区域:对象头、实例数据、对齐填充数据。

image

java对象头中的mark word区域就有锁状态的标记信息。

所谓的锁升级和降级,就是jvm对synchronized运行的机制,当jvm监测到不同的竞争状况时,会自动切换到不同的锁实现。这种切换就是锁的升级和降级。

在jdk1.6之前,synchronized是重量级锁,运行在虚拟机上,而虚拟机是应用级别的程序,运行在用户态,需要通过操作系统内核程序发申请,得到反馈获得锁,所以称synchronized为重量级锁。就是Monitor的实现完全是依靠操作系统内部的互斥锁,因为需要进行用户态和内核态的切换。

在jdk1.5升级为jdk1.6的过程中,高并发是一个重要的改进项,jdk1.6的版本上开发团队也是花费了大力气为重量级锁减重,实现各种锁优化技术。为了减少获得锁和释放锁带来的性能损耗,提高性能,引入新的概念,无锁、轻量级锁、偏向锁。

锁的状态有四种:无锁、偏向锁、轻量级锁、重量级锁。

伴随着锁的竞争,锁可以从偏向锁升级到轻量级锁再升级到重量级锁。jdk1.6中默认是开启偏向锁和轻量级锁的,我们也可以通过-XX:UseBiasedLocking来禁用偏向锁。

偏向锁就是把当前的锁偏向于某个线程,这种锁适合同一个线程多次去申请同一份资源的时候,并且没有其他线程来和自己竞争的情况下。轻量级锁也可以称为自旋锁,通过多次自旋尝试来获取锁,自旋这种机制能够保证用户态到内核态切换的过程中带来的性能锁损耗。

当有线程来竞争锁资源的时候,synchronized会首先尝试使用偏向锁来处理,如果能够竞争到偏向锁,表示加锁成功,直接返回就好了,如果竞争偏向锁失败,表示当前已经有线程占有了偏向锁,这个时候就会升级到轻量级锁,竞争锁的线程会根据自适应自旋次数去尝试占有锁资源,如果还是没有竞争到锁的话就会升级到重量级锁,在这种状态下没有竞争到锁的线程就会被阻塞,一直等到占有锁的线程执行完任务之后释放锁资源的时候,它才能被唤醒执行任务。这种思想是一种性能和安全性的平衡。

标签:synchronized,竞争,线程,轻量级,重量级,偏向
From: https://www.cnblogs.com/dongyaotou/p/18402852

相关文章

  • 深入理解synchronized的原理是什么
    对象头锁机制原则Synchronized的原理是什么  Synchronized是由JVM实现的一种实现互斥同步的实现方式。如果查看synchronized关键字修饰的字节码,会发现在编译器生成了monitorenter和monitorexit两个字节码指令。  这两个指令的意思就是在虚拟机执行到monitorenter......
  • java并发 第四章共享模型之管程 3 synchronized 原理
    1.轻量级锁轻量级锁的使用场景:如果一个对象虽然有多线程要加锁,但加锁的时间是错开的(也就是没有竞争),那么可以使用轻量级锁来优化。轻量级锁对使用者是透明的,即语法仍然是synchronized假设有两个方法同步块,利用同一个对象加锁 staticfinalObjectobj=newObject();......
  • java中的synchronized
    介绍Java中的synchronized关键字是一种内置的同步机制,用于实现线程之间的互斥,以确保多个线程在同一时刻只能有一个线程访问特定的代码段或对象。synchronized可以用于方法或代码块,从而实现对共享资源的安全访问。前言需要明确的是,锁是针对对象而言的,以下场景实际上都是在描述外......
  • 你知道synchronized关键字的底层原理?
    Synchronized【对象锁】采用互斥的方式让同一时刻至多只有一个线程能持有【对象锁】,其它线程再想获取这个【对象锁】时就会阻塞住如下抢票的代码,如果不加锁,就会出现超卖或者一张票卖给多个人publicclassTicketDemo{staticObjectlock=newObject();intticketNum=......
  • synchronized
    要想理解synchronized原理,必须要了解cas和用户态、内核态的理论synchronized是关键字,具体怎么实现要翻cpp、汇编代码,记住理论就行了CAS全称叫CompareAndSwap或者CompareAndSet,比较并交换、比较并设置。具体是:在执行操作之前,先比较当前内存中的值是否等于期望值,如......
  • Android开发 - synchronized 关键字控制多个线程对共享资源的访问解析
    什么是synchronizedsynchronized一个关键字,用于实现线程同步。其主要作用是控制多个线程对共享资源的访问,确保被synchronized修饰的代码块或方法同一时间只有一个线程可以执行,从而避免数据不一致的问题为什么需要synchronized在多线程编程中,多个线程可能同时访问和修改......
  • Synchronized重量级锁原理和实战(五)
    在JVM中,每个对象都关联这一个监视器,这里的对象包含可Object实例和Class实例.监视器是一个同步工具,相当于一个凭证,拿到这个凭证就可以进入临界区执行操作,没有拿到凭证就只能阻塞等待.重量级锁通过监视器的方式保证了任何时间内只允许一个线程通过监视器保护的临界区代码.......
  • Java并发编程 - 基础(悲观锁与synchronized)(偏向锁、轻量级锁、锁优化)
    Java并发编程中的悲观锁和synchronized关键字,以及Java内存模型中的锁优化机制(如偏向锁、轻量级锁)都是非常重要的概念。下面将详细介绍这些内容。悲观锁(PessimisticLocking)悲观锁假设数据会发生冲突,因此在读取数据时就加锁,以防止其他线程修改数据。这种方式虽然能保......
  • 操作集合的工具类:Collections(以及将线程变安全的synchronized方法)
      静态成员方法:    publicstatic<T>voidsort(List<T>list)升序    publicstatic<T>intbinarySearch(List<?>list,Tkey)二分查找    publicstatic<T>Tmax(Collection<?>coll)找最大值    publicstaticvoidreve......
  • synchronized轻量级锁原理和实战(四)
    引入轻量级锁的目的多线程竞争不激烈的情况下,通过CAS机制竞争减少重量级锁产生的性能消耗.重量级锁使用了操作系统底层的互斥锁,会导致线程在用户态和核心态之间切换.带来性能上的损耗.轻量级锁的核心原理轻量级锁存在的目的本身就是为了减少线程从内核态和用户态的切换,从......