Android 基础技术——Synchonized 关键字

本文详细介绍了Synchronized关键字在Android中的作用,包括原子性、可见性和有序性的保证,以及基于Monitor对象的原理。还探讨了同步代码块和同步方法的实现机制,以及锁的优化策略如偏向锁、轻量级锁和重量级锁。
摘要由CSDN通过智能技术生成

 笔者希望做一个系列,整理 Android 基础技术,本章是关于Synchonized 关键字

Synchronized 关键字的作用是什么?

原子性:确保线程互斥访问同步代码

可见性:保证共享变量的修改能够及时可见,就是通过 Java 内存模型中 “对一个变量unlock 操作之前,必须同步到主内存中;对一个变量进行lock操作,则会清空工作内存中此变量的值;在执行引擎使用此变量之前,需要从主内存中load操作或者assign操作初始化变量值”来保证的。

有序性:有效解决重排序问题,即:一个unlock 操作先行发生于后面对同一个变量的lock操作

原理是什么?

Java 虚拟机中的同步是基于进入和退出管程Monitor 对象实现的,无论是显式同步(有明确的monitorenter 和 monitorexit 指令 即同步代码块)还是隐式同步都是如此

同步代码块的原理是什么

被synchronized 修饰的代码,在被编译器编译后被修饰的代码前后加上一组字节指令。在代码的开始加入了 monitorenter,在代码后面加入了 monitorexit,这两个字节码指令配合完成了 synchronized关键字修复代码的互斥访问。在虚拟机器执行到monitorenter指令的时候,会请求获取对象的monitor 锁,基于monitor 锁又衍生出一个锁计数器的概念。当执行 monitorenter时,若对象未被锁定,或者当前线程已经拥有了此对象的monitor 锁,则锁计数器+1,该线程获取该对象锁。当执行monitorexit 时,锁计数器-1,当计数器为0 时,此对象锁就被释放了。那么其他阻塞的线程则可以获取该monitor 锁

同步方法的原理是什么

使用方法级的synchonized 是隐式同步,无需通过字节码指令来控制,它的实现在方法调用和返回操作之中。

JVM 可以从方法常量池中的方法表结构(method_ifno Structure) 中的 ACC_SYNCHRONIZED 访问标志区分一个方法是否同步方法。当方法调用时候,调用指令将会检查方法的 ACC_SYNCHRONIZED 访问标志是否被设置,如果设置了,执行线程将先持有 monitor (虚拟机规范中用的管程),然后执行方法,最后在方法完成(无论是正常完成还是非正常完成)时释放 monitor

synchronized 锁优化是什么
  • 偏向锁,是指一段同步代码一直被一个线程访问,那么这个线程会自动获取锁,降低获取锁的代价。
  • 轻量级锁,是指当锁是偏向锁时,被另一个线程所访问,偏向锁会升级为轻量级锁,这个线程会通过自旋的方式尝试获取锁,不会阻塞,提高性能。
  • 重量级锁,是指当锁是轻量级锁时,当自旋的线程自旋了一定的次数后,还没有获取到锁,就会进入阻塞状态,该锁升级为重量级锁,重量级锁会使其他线程阻塞,性能降低。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值