对同步监视器的理解

在 JAVA 虚拟机中,每个对象通过某种逻辑关联监视器,为了实现监视器的互斥功能,每个对象都关联着一个锁,这个锁在操作系统书籍中称为“信号量”。

如果一个线程拥有了某些数据的锁,其他的线程则无法获得锁,直到这个线程释放了这个锁。在多线程中,如果任何时候都是我们自己来写这个信号量,显然不是很方便。但JVM 为我们自动实现了这些。

为了使数据不被多个线程访问,java 提供了同步块以及同步方法等实现,一旦一段代码被嵌入到一个 synchronized 关键字中,意味着放入了监视区域,JVM 在后台会自动为这段代码实现锁的功能。

监视器和锁在 Java 虚拟机中是一块使用的。监视器监视一块同步代码块,确保一次只有一个线程执行同步代码块。每一个监视器都和一个对象引用相关联。线程在获取锁之前不允许执行同步代码。

synchronized (Object obj) {
	// 同步代码块
}

这个语法的意思就是进入代码块之前先将资源 obj 锁定住,只有锁定住资源 obj 的线程才有资格执行后面的代码块,代码块执行完毕之后线程就释放了对资源 obj 的锁定,然后 obj 就可以被其它线程锁定并使用。

通俗地讲就是只有获取对 obj 的锁定之后才能用后面代码块中的代码访问 obj 资源,否则就无法访问 obj 也无法执行后面的代码,只能让线程停滞在那里等待其它线程解除对 obj 的锁定。

转载自https://www.cnblogs.com/rain8005/p/16129840.html

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值