锁和监视器之间的区别 – Java并发 您所在的位置:网站首页 监视器的原理 锁和监视器之间的区别 – Java并发

锁和监视器之间的区别 – Java并发

2023-07-06 15:31| 来源: 网络整理| 查看: 265

在面试中你可能遇到过这样的问题:锁(lock)和监视器(monitor)有什么区别?

嗯,要回答这个问题,你必须深入理解Java的多线程底层是如何工作的。

简短的答案是,锁为实现监视器提供必要的支持。详细答案如下。

锁(lock)

逻辑上锁是对象内存堆中头部的一部分数据。JVM中的每个对象都有一个锁(或互斥锁),任何程序都可以使用它来协调对对象的多线程访问。如果任何线程想要访问该对象的实例变量,那么线程必须拥有该对象的锁(在锁内存区域设置一些标志)。所有其他的线程试图访问该对象的变量必须等到拥有该对象的锁有的线程释放锁(改变标记)。

一旦线程拥有一个锁,它可以多次请求相同的锁,但是在其他线程能够使用这个对象之前必须释放相同数量的锁。如果一个线程请求一个对象的锁三次,如果别的线程想拥有该对象的锁,那么之前线程需要 “释放”三次锁。

Java中显示锁的使用语法如下:

… private Lock bankLock = new ReentrantLock(); … public double getTotalBalance() { bankLock.lock(); try { double sum = 0; for (double a : accounts) sum += a; return sum; } finally { bankLock.unlock(); } }

1) 锁用来保护代码片段,任何时刻只能有一个线程执行被保护的代码。

2) 锁可以管理试图进入被保护代码的线程

3) 锁可以拥有一个或者多个相关的条件对象

4) 每个条件对象管理那些已经进入被保护的代码段,但还不能运行的线程

Lock和Condition接口为程序设计人员提供了高度的锁定控制。然后大多数情况下,并不需要这样的控制,并且可以使用一种嵌入Java语言的内部机制。从1.0版本开始,Java中的每一个对象都有一个内部锁。如果一个方法用synchronized关键字声明,那么对象的锁将保护整个方法。也就说,要调用该方法,线程必须获得内部的对象锁。

内部锁的一般用法如下:

public synchronized void transfer(int from, int to, double amount) throws InterruptedException { while (accounts[from]


【本文地址】

公司简介

联系我们

今日新闻

    推荐新闻

    专题文章
      CopyRight 2018-2019 实验室设备网 版权所有