JAVA多线程编程--synchronized 关键字

synchronized 关键字


用途:保证一个时刻点上只有一个线程在执行,不会出现并发的情况,达到排队执行的目的


synchronized 的用法

3 种不同的用法:对象锁、类锁和同步块。注意:synchronized 不能修改构造器、变量等,
synchronized 支持重入


synchronized 底层原理

sychronized 作用:
1、原子性:synchronized 保证语句块内操作是原子的
2、可见性:synchronized 保证可见性(通过在执行unlock 之前,必须先把此变量同步回
主内存实现)
3、有序性:synchronized 保证有序性(通过一个变量在同一时刻只允许一条线程对其进
行lock 操作)
底层原理的话术:
同步代码块在源代码编译成字节码时,同步代码部分是利用monitorenter 和monitorexit
这两个字节码指令。它们分别位于同步代码块的开始和结束位置。当jvm 执行到
monitorenter 指令时,当前线程试图获取monitor 对象的所有权,如果未加锁或者已经被
当前线程所持有,就把锁的计数器+1;当执行monitorexit 指令时,锁计数器-1;当锁计
数器为0 时,该锁就被释放了。如果获取monitor 对象失败,该线程则会进入阻塞状态,
直到其他线程释放锁。
1、synchronized 是可重入的,所以不会自己把,自己锁死
2、synchronized 锁一旦被一个线程持有,其他试图获取该锁的线程将被阻塞。
同步方法级的同步是隐式,即无需通过字节码指令来控制的,它实现在方法调用和返回操作
之中。JVM 可以从方法常量池中的方法表结构method_info Structure 中的
ACC_SYNCHRONIZED 访问标志区分一个方法是否同步方法。当方法调用时,调用指令将
会检查方法的ACC_SYNCHRONIZED 访问标志是否被设置,如果设置了,执行线程将先持
有monitor 管程, 然后再执行方法,最后再方法完成(无论是正常完成还是非正常完成)时
释放monitor。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值