Java 并发中 Lock 和 Monitor 的区别2024年9月10日 | 阅读 6 分钟 LockJava 中的 Lock 是同步原语,用于控制对共享资源或代码关键部分的访问,以确保一次只有一个线程可以访问它们。 Lock 是一种简单的同步构造,允许一个线程获取资源的锁。一旦一个线程获取了资源的锁,第一个线程在释放锁之后,其他线程就可以再次获取该锁。 Lock 确保一次只有一个线程可以访问受保护的资源,从而防止了竞态条件和数据损坏。 Java 提供了几种实现 Lock 的机制,其中最常用的是来自java.util.concurrent.locks包的 'ReentrantLock' 类。以下是 Java 并发中 Lock 的概述: 1. ReentranLockJava 中的ReentrantLock是一种同步机制,它允许线程多次获取同一个锁而不会阻塞自身。当线程需要访问由锁保护的共享资源时,它非常有用。 ReentrantLock 提供了多种锁定和解锁方法,包括 lock()、unlock()、tryLock() 和 newCondition()。 与 synchronized 块或方法相比,它提供了更细粒度的同步控制。 ReentrantLockExample.java 输出 Thread 1 is performing a task. Thread 1 has completed the task. Thread 2 is performing a task. Thread 2 has completed the task. 在此示例中,doSomething() 方法在访问共享资源之前获取锁。当方法完成对资源的访问后,它会释放锁。 2. Lock 接口Java 提供了各种 Lock 接口,例如 Lock、ReadWriteLock 和 Condition,使我们能够为特定的并发需求选择合适的 Lock 类型。 3. 异常处理Lock 应在 try-finally 块中使用,以确保即使发生异常也能正确释放锁。 重要的是要防止资源泄露,并确保当前线程完成后,其他线程可以访问被锁定的资源。 4. 并发集合java.util.concurrent 包中的许多类在内部使用 Lock 来提供线程安全集合,例如 ConcurrentHashMap 和 CopyOnWriteArrayList。 Monitor在 Java 并发中,Monitor 是一种与对象和方法关联的同步概念。它提供了多线程的基本要求。 Monitor 是一种同步机制,它允许线程拥有 互斥性 - 在同一时间只有一个线程可以执行该方法,使用锁。 协作 - 使用 wait-set 使线程等待某些条件满足的能力。 Monitor 主要“监视”线程之间对共享资源和对象的访问控制。 1. 同步方法我们可以将 Java 中的方法声明为 synchronized,使其成为同步方法。当线程进入同步方法时,它会获取与对象实例关联的 Monitor。 2. 同步块除了同步方法,我们还可以使用同步块来保护代码的特定部分。它允许更细粒度的同步控制。 SynchronisedBlockExample.java 输出 Final Count: 0 3. 内置锁在 Java 中,每个对象都有一个内置锁,也称为 Monitor 锁。它允许线程获取对对象的独占访问。这意味着在同一时间只有一个线程可以执行对该对象进行同步的代码。内置锁用于防止竞态条件。 要获取内置锁,线程会调用 synchronized() 方法。synchronized() 方法将一个对象作为其参数。然后线程获取该对象的内置锁。一旦线程获取了锁,它就可以执行同步代码,而无需担心其他线程的干扰。 当线程完成同步代码的执行后,它必须释放内置锁。线程再次调用 synchronized() 方法,这次带有 false 参数。false 参数告诉 synchronized() 方法释放锁。 IntrinsicLockExample.java 输出 Thread 1 is performing a synchronized task. Thread 1 has completed the task. Thread 2 is performing a synchronized task. Thread 2 has completed the task. 4. 确保线程安全当多个线程并发访问共享数据或资源时,Monitor 用于确保线程安全。 通过同步方法或块,您可以防止竞态条件、数据损坏和其他并发问题。 5. 死锁当两个或多个线程等待对方释放锁时,就会发生死锁,导致程序停滞不前。 适当的设计和仔细使用同步块有助于避免死锁。 DeadlockExample.java 输出 Thread 1: Holding resource1... Thread 2: Holding resource2... Thread 1: Waiting for resource2... Thread 2: Waiting for resource1... 虽然 Monitor 有助于防止竞态条件,但如果使用不当,也可能导致死锁。 Lock 和 Monitor 的主要区别
|
在Java中,包是类、子包和接口的集合。它支持将现有类组织到文件夹结构中,使其更易于查找和使用。更重要的是,它促进了代码的重用。每个包都有自己的名称。类和...
阅读 4 分钟
Java 中的图像处理 - 图像比较 它具有许多用于图像处理的库和工具,例如 BufferedImage、Graphics2D 和 java.awt 包,它们已准备好通过诸如编辑、编辑和比较图像之类的功能来帮助进行图像编辑。这些库使任何开发人员都能够...
7 分钟阅读
? 在 Java 中,从方法返回二维数组在处理复杂数据结构或执行各种数据操作任务时可能是一项有用的操作。在本节中,我们将深入探讨如何在 Java 中返回二维数组的详细信息,并提供分步……
阅读 6 分钟
Java 中的魔术数字 程序 在编程中,魔术数字是指直接在代码中使用的、未经明确定义或解释的硬编码数字或字符串值。它以后可能会更改。它用于标识目的。它似乎是任意的,没有上下文或...
7 分钟阅读
在 Java 中,JAR 是 Java ARchive 的缩写,其格式基于 zip 格式。JAR 文件格式主要用于将一组文件聚合到一个文件中。它是一种单一的跨平台存档格式,可以处理图像、音频和类文件...
阅读 2 分钟
LinkedHashMap 是 Java 编程中的一个预定义类,可以从 HashMap 扩展而来。它提供了一个一致的迭代顺序的哈希表。java.util 包包含 LinkedHashMap,它用于维护双向链表。语法:LinkedHashMap<K, V> map = new LinkedHashMap<>(initialCapacity, loadFactor, accessOrder); 参数:K:…
阅读 3 分钟
Java 中可以重写静态方法吗?在 Java 中,重写和重载是面向对象编程最重要的两个特性。当我们要实现多态性时,就会使用该特性。静态方法:具有 static 关键字的方法称为静态方法。在其他...
阅读 6 分钟
CountDownLatch 类是另一个重要的并发执行类。它是一个同步辅助工具,允许一个或多个线程等待,直到另一个线程执行的一组操作完成。它使用传递给...的计数进行初始化。
5 分钟阅读
查找最长无重复字符子串长度的任务是算法编程中的一个重要挑战。该问题涉及识别给定字符串中每个字符只出现一次的连续部分的 are length。解决此挑战在...
阅读 16 分钟
在计算问题中,在二进制矩阵中查找最大矩形是经典的挑战性问题,它测试了对动态规划和基于堆栈的方法的理解。该问题通常出现在图像处理、计算机视觉甚至游戏开发等各种领域。在此...
阅读 6 分钟
我们请求您订阅我们的新闻通讯以获取最新更新。
我们提供所有技术(如 Java 教程、Android、Java 框架)的教程和面试问题
G-13, 2nd Floor, Sec-3, Noida, UP, 201301, India