您当前的位置:首页 > 淘宝百科

synchronized底层原理(synchronized如何实现可重入)

时间:2023-01-30 20:02:08

本文目录

  • synchronized如何实现可重入
  • 如何使用关键字synchronized来实现同步访问
  • synchronized和lock的区别,以及底层实现原理
  • synchronized的底层怎么实现的
  • java sychronized轻量锁自动实现的吗
  • java如何实现线程安全,synchronized和lock的区别,可重入锁
  • 多线程安全实现方式,synchronized和lock,信号量的区别
  • synchronized实现何时使用了自旋锁还是互斥锁
  • synchronized底层原理是什么
  • stringbuffer和stringbuilder的区别,底层实现原理

synchronized如何实现可重入

每个锁关联一个线程持有者和一个计数器。当计数器为0时表示该锁没有被任何线程持有,那么任何线程都都可能获得该锁而调用相应方法。当一个线程请求成功后,JVM会记下持有锁的线程,并将计数器计为1。此时其他线程请求该锁,则必须等待。而该持有锁的线程如果再次请求这个锁,就可以再次拿到这个锁,同时计数器会递增。当线程退出一个synchronized方法/块时,计数器会递减,如果计数器为0则释放该锁。

如何使用关键字synchronized来实现同步访问

1、synchronized关键字的作用域有二种: 1)是某个对象实例内,synchronized aMethod(){}可以防止多个线程同时访问这个对象的synchronized方法(如果一个对象有多个synchronized方法,只要一个线程访问了其中的一个synchronized方法,其它线程不能同时访问这个对象中任何一个synchronized方法)。这时,不同的对象实例的 synchronized方法是不相干扰的。也就是说,其它线程照样可以同时访问相同类的另一个对象实例中的synchronized方法; 2)是某个类的范围,synchronized static aStaticMethod{}防止多个线程同时访问这个类中的synchronized static 方法。它可以对类的所有对象实例起作用。 2、除了方法前用synchronized关键字,synchronized关键字还可以用于方法中的某个区块中,表示只对这个区块的资源实行互斥访问。用法是: synchronized(this){/*区块*/},它的作用域是当前对象;

synchronized和lock的区别,以及底层实现原理

总的来说,lock更加灵活。 主要相同点:Lock能完成synchronized所实现的所有功能 不同: 1.ReentrantLock功能性方面更全面,比如时间锁等候,可中断锁等候,锁投票等,因此更有扩展性。在多个条件变量和高度竞争锁的地方,

synchronized的底层怎么实现的

可以这样理解代码块同步是使用monitorenter和monitorexit指令实现, monitorenter指令是在编译后插入到同步代码块的开始位置,而monitorexit是插入到方法结束处和异常处, JVM要保证每个monitorenter必须有对应的monitorexit与之配对。任何对象都有一个 monitor 与之关联,当且一个monitor 被持有后,它将处于锁定状态。线程执行到 monitorenter 指令时,将会尝试获取对象所对应的 monitor 的所有权,即尝试获得对象的锁。

java sychronized轻量锁自动实现的吗

1 synchronized原理synchronized关键字编译后会在同步块的前后添加上montorenter和monitorexit两个字节码指令,这两个字节码指令都需要一个指向锁定和解锁对象的reference,如果指定了同步的对象reference就指向这个对象,如果修饰的是方法,如果是类方法就指向Class对象,如果是实例方法就指向这个实例。2线程安全2.1定义当多线程访问一个对象时,如果不需要考虑多线程的调度和交替执行,也不需要进行额外的同步,或者在调用方进行额外的协调操作,调用这个对象的行为都可以获得正确的结果,就可以说这个对象是线程安全的。2.2原子性java内存模型直接保证的原子性包括:read load use assign store write这6个,另外synchronized之间的操作也具备原子性。2.3可见性可见性指一个线程修改了共享变量的值,另外一个线程立即能够获得这个修改。volatile通过修改后能够立即同步回主内存,使用之前必须从主内存刷新,保证了可见性。synchronized和final变量也保证了可见性。2.4有序性同一个线程内,所有操作都是有序的,从一个线程观察另外一个线程,都是无序的。synchronized 可以保证同一个锁的同步块只能串行进入。3 synchronized缺点synchronized是一种悲观锁,锁存的的问题:1.多线程竞争的情况下,频繁的加锁解锁导致过多的线程上下文切换,由于java线程是基于操作系统内核线程实现的,所以如果阻塞或者唤醒线程都需要切换到内核态操作,这需要耗费许多CPU时钟。2.一个线程持有锁,会导致其他请求该锁的线程挂起。3.如果高优先级线程请求的锁,被低优先级线程占用,则会发生优先级倒置。4锁优化4.1 锁自旋很多应用中共享数据的锁定,只会持续很多的一段时间,为了这很短的一段时间做线程的挂起和恢复,会造成很大的性能消耗,因为java线程对应操作系统的内核线程,要做挂起和恢复需要从用户态切换到通过系统调用完成,所以让后面请求锁的线程自旋一会。4.2 锁消除代码上要求同步,但是虚拟机检测到不存在共享数据竞争的情况下,会做锁消除。有很多同步不是程序员自己加上的。4.3 锁粗化一般情况下锁应该范围尽可能的小。但是如果是循环内的锁,才可以通过锁粗化来避免频繁的加锁解锁消耗性能。4.4 对象头HotSpot虚拟机的对象头分为两部分,第一部分用于存储对象自身的运行时数据,如hashCode,GC分代年龄,官方称之为“mark word“,第二部分用于存储指向方法区对象类型的指针,如果是数组类型的还有一个存储数组长度的部分。

java如何实现线程安全,synchronized和lock的区别,可重入锁

一、synchronized和lock的用法区别

synchronized:在需要同步的对象中加入此控制,synchronized在方法上,也在特定代码块中,括号中表示需要锁的对象。

lock:需要显示指定起始位置和终止位置。一般使用ReentrantLock类做为锁,多个线程中必须要使用一个ReentrantLock类做为对象才能保证锁的生效。且在加锁和解锁处需要通过lock()和unlock()显示指出。所以一般会在finally块中写unlock()以防死锁。

二、synchronized和lock用途区别

synchronized原语和ReentrantLock在一般情况下没有什么区别,但是在非常复杂的同步应用中,请考虑使用ReentrantLock,特别是遇到下面2种需求的时候。

  • 某个线程在等待一个锁的控制权的这段时间需要中断

  • 2.需要分开处理一些wait-notify,ReentrantLock里面的Condition应用,能够控制notify哪个线程

  • 3.具有公平锁功能,每个到来的线程都将排队等候

  • 多线程安全实现方式,synchronized和lock,信号量的区别

    java中synchronized同步处理后,代表该线程是同步的,即多线程访问时,无法同时有两个或以上线程进行访问。具体的原理是,当第一个线程进入该同步代码块之后,会暂时获得同步块的锁,当第二个线程进入时,由于第一个线程并未结束,同步代码块的锁没有释放,所以第二个线程进不来,达到只有一个线程在运行的目的。synchronized同步处理通常用于封装需要共享的可改变的数据,为了让数据更安全所使用的技术。

    synchronized实现何时使用了自旋锁还是互斥锁

    synchronized的锁是针对多线程的,从线程的角度去思考才能真正弄明白。 Java的synchronized使用方法总结1. 把synchronized当作函数修饰符时这也就是同步方法,那这时synchronized锁定的是哪个对象呢?它锁定的是调用这个同步方法对象。也就是说,当一个对象P1在不同的线程中执行这个同步方法时,它们之间会形成互斥,达到同步的效果。但是这个对象所属的Class所产生的另一对象P2却可以任意调用这个被加了synchronized关键字的方法。同步块,示例代码如下: public void method3(SomeObject so) { synchronized(so){ //…..}}这时,锁就是so这个对象,谁拿到这个锁谁就可以运行它所控制的那段代码。当有一个明确的对象作为锁时,就可以这样写程序,但当没有明确的对象作为锁,只是想让一段代码同步时,可以创建一个特殊的instance变量(它得是一个对象)来充当锁。3.将synchronized作用于static 函数,示例代码如下: Class Foo {public synchronized static void methodAAA() // 同步的static 函数{//….}public void methodBBB(){ synchronized(Foo.class) // class literal(类名称字面常量)} } 代码中的methodBBB()方法是把class literal作为锁的情况,它和同步的static函数产生的效果是一样的,取得的锁很特别,是当前调用这个方法的对象所属的类(Class,而不再是由这个Class产生的某个具体对象了)。

    synchronized底层原理是什么

    在虚拟机执行到monitorenter指令的时候,会请求获取对象的monitor锁,基于monitor锁又衍生出一个锁计数器的概念。

    当执行monitorenter时,若对象未被锁定时,或者当前线程已经拥有了此对象的monitor锁,则锁计数器+1,该线程获取该对象锁。

    当执行monitorexit时,锁计数器-1,当计数器为0时,此对象锁就被释放了。那么其他阻塞的线程则可以请求获取该monitor锁。

    扩展资料

    synchronized的特性

    1、原子性

    所谓原子性就是指一个操作或者多个操作,要么全部执行并且执行的过程不会被任何因素打断,要么就都不执行。

    2、可见性

    可见性是指多个线程访问一个资源时,该资源的状态、值信息等对于其他线程都是可见的。

    3、有序性

    有序性值程序执行的顺序按照代码先后执行。

    4、可重入性

    synchronized和ReentrantLock都是可重入锁。当一个线程试图操作一个由其他线程持有的对象锁的临界资源时,将会处于阻塞状态,但当一个线程再次请求自己持有对象锁的临界资源时,这种情况属于重入锁。

    stringbuffer和stringbuilder的区别,底层实现原理

    1、StringBuffer 与 StringBuilder 中的方法和功能完全是等价的,2、只是StringBuffer 中的方法大都采用了 synchronized 关键字进行修饰,因此是线程安全的,而 StringBuilder 没有这个修饰,可以被认为是线程不安全的。 3、在单线程程序下,StringBuilder效率更快,因为它不需要加锁,不具备多线程安全而StringBuffer则每次都需要判断锁,效率相对更低

    线程

    最新文章