并发编程读书笔记(三)synchronized 和 四种锁状态

在多 线 程并 发编 程中 synchronized 一直是元老 角色,很多人都会称呼它 重量 级锁 。但
是,随着 Java SE 1.6 synchronized 行了各种 化之后,有些情况下它就并不那么重了。
 
先来看下利用 synchronized 实现 同步的基 Java 中的每一个 象都可以作 为锁 。具体表
以下 3 种形式。
· 于普通同步方法, 是当前 象。
· 于静 同步方法, 是当前 Class 象。
· 于同步方法 Synchonized 括号里配置的 象。
 
 
Synchonized JVM 里的 实现 原理, JVM 基于 入和退出 Monitor对象
{
    //TODO 
 了解管程 ( )
   每一个对象和类都与一个监视器相关联
   要线程独占某块数据/代码(SpecialRoom)  ,那么先进入Hallway等待,然后调度器基于某些规则(如先进先出)从Hallway中取一个线程,若线程处于被挂起状态 那么就把它送进等待房间,过一段时间再送进 SpecialRoom。
 
 而Monitor (监视器)的作用就是 保证 仅一个线程访问受保护的数据/代码
在Java中 每个对象和类都有一个监视器与之关联。为了实现监视器的互斥功能,锁(有时候也称为互斥体)与每一个对象和类关联。在操作系统书中,这叫做信号量,互斥锁也被称为二元信号量。

    如果一个线程拥有某些数据上的锁,其他线程想要获得锁只能等到这个线程释放锁。如果我们在进行多线程编程时总是需要编写一个信号量,那就不太方便了。幸运的是,我们不需要这样做,因为JVM会自动为我们做这件事。

JVM会实现一个信号量,来与每个类/对象的监视器关联。

    为了声明一个同步区域(这里意味着数据不可能被超过一个线程访问),Java提供了synchronized块和synchronized方法。一旦代码被synchronized关键字绑定,它就是一个监视器区域。它的锁将会在后面被JVM实现。

}
 
来实现 方法同步和代 码块 同步,但两者的 实现细节 不一 。代 码块 同步是使用 monitorenter
monitorexit 指令 实现 的,而方法同步是使用另外一种方式 实现 的, 细节 JVM 范里并没有
详细说 明。但是,方法的同步同 可以使用 两个指令来 实现
 
monitorenter 指令是在 编译 后插入到同步代 码块 的开始位置,而 monitorexit 是插入到方法
和异常 JVM 每个monitorenter
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值