Java 中的 synchronized 关键字(用法和示例)2025 年 4 月 20 日 | 阅读 6 分钟 在 Java 中,synchronized 关键字提供了一种机制来控制多个线程对共享资源的访问。使用 synchronized 关键字,我们可以防止数据损坏和未经授权的访问。它为方法或代码块提供了一个锁,这样一次只有一个线程可以使用它。通过获取方法和代码块的锁,我们可以确保线程安全。 阅读更多 Java 中的同步 synchronized 关键字的用法synchronized 关键字可以与方法和代码块一起使用。当一个方法或代码块被声明为 synchronized 时,就会在指定的对象上获得一个锁,并且其他线程在锁被释放之前无法访问 synchronized 代码。 同步方法当您希望确保一次只有一个线程可以访问整个方法时,可以使用同步方法。当方法修改共享资源(如类变量或数据结构)时,这很有用。 语法 同步方法示例示例编译并运行输出 Counter: 2000 解释 在这个示例中,我们创建了一个 SynchronizedExample 类,其中包含一个实例变量 counter,我们希望以同步的方式对其进行递增。我们使用 synchronized 关键字定义了一个名为 increment() 的方法。这意味着一次只有一个线程可以执行此方法,从而确保以线程安全的方式递增 counter。 在 main 方法中,我们创建了两个线程,并将 lambda 表达式传递给 Thread 构造函数。每个 lambda 表达式都包含一个循环,通过调用 SynchronizedExample 对象的 increment() 方法来递增 counter。 我们使用 start() 方法启动两个线程,然后通过调用每个线程的 join() 方法来等待两个线程完成。最后,我们将 counter 的值打印到控制台。 输出表明,两个线程都成功地将 counter 分别递增了 1000 次,最终值为 2000。由于我们使用 synchronized 关键字确保一次只有一个线程执行 increment 方法,因此我们可以确信 counter 是以线程安全的方式递增的。 同步代码块Java Synchronized 代码块可用于对方法中的任何特定资源执行同步。 阅读更多 Java 中的同步代码块 假设我们的方法中有 50 行代码,但我们只想同步 5 行;在这种情况下,我们可以使用同步代码块。如果我们把方法的所有代码都放在同步代码块中,它的效果将与同步方法相同。 语法 同步代码块示例示例编译并运行输出 5 * 1 = 5 5 * 2 = 10 5 * 3 = 15 5 * 4 = 20 5 * 5 = 25 5 * 6 = 30 100 * 1 = 100 100 * 2 = 200 100 * 3 = 300 100 * 4 = 400 100 * 5 = 500 100 * 6 = 600 要记住的重要事项
synchronized 关键字还可以用于
同步实例方法在实例方法上使用 synchronized,锁会在当前对象(this)上获取。如果多个线程使用同一个对象访问该方法,它们必须相互等待以释放锁。 语法 同步实例方法示例示例编译并运行输出 1 2 3 4 5 6 7 8 9 10 1 2 3 4 5 6 7 8 9 10 静态同步虽然同步方法可以确保一次只有一个线程可以访问它,但如果方法的操作不是顺序的,或者方法本身没有明确考虑执行顺序,它不能保证输出的顺序。 因此,为了保持同步行为,仅凭实例级别的锁是不够的;我们需要一个类级别的锁,这可以通过静态同步来实现。 例如,考虑以下场景。 假设一个类有多个静态同步方法(demo1、demo2、demo3、demo4),一个线程正在访问方法 demo1,那么此时其他线程无法访问其他静态同步方法。 阅读更多 Java 中的静态同步 语法 静态同步示例示例编译并运行输出 Good Night: Mahi Good Night: Mahi Good Night: Mahi Good Night: Mahi Good Night: Sachin Good Night: Sachin Good Night: Sachin Good Night: Sachin Good Night: Mahi Good Night: Mahi Good Night: Mahi Good Night: Mahi Good Night: Sachin Good Night: Sachin Good Night: Sachin Good Night: Sachin 要记住的重要事项
下一个主题Java 中的算术运算符 |
? 拦截器在软件开发中起着至关重要的作用,尤其是在框架和中间件的上下文中。在 Java 中,拦截器提供了一种强大的机制来拦截程序执行流中的方法调用或事件。它允许开发人员添加跨领域关注点,例如日志记录、身份验证和...
阅读 6 分钟
问题陈述:给定一个代表 n 枚硬币的数字 n,我们需要用这些硬币构成一个楼梯。楼梯的第 i 行包含正好 i 枚硬币。目标是确定可以使用 n 枚硬币形成的完整行数。方法...
5 分钟阅读
多项式乘法是学习代数或计算机科学的人都需要知道的,它被用于信号处理、控制系统和计算代数等领域。这可能涉及两个多项式,并将这两个多项式相乘,并将项加到结果中...
5 分钟阅读
在 Java 编程的世界中,有许多场景可能需要计算给定字符串中不同字符的数量。无论我们是开发文本分析工具、文字游戏,还是任何处理文本数据的应用程序,了解如何……
阅读 4 分钟
在 Java 中,有多种方法可以创建和访问文本文件。在处理大量应用程序时,执行此操作非常必要。Java 有多种读取纯文本文件的方法,例如 FileReader、BufferedReader 和 Scanner。每种实用程序都提供独特的功能;例如,…
阅读 4 分钟
Java IO 包提供了几种在 Java 中将字符串追加到现有文件的方法。将字符串追加到文件意味着将新数据添加到现有文件的末尾,而不会覆盖或删除之前的数据。方法:将字符串追加到文件。追加...
阅读 4 分钟
问题陈述 复制整数堆栈的示例最好描述如下:通常,我们需要一个辅助堆栈或其他数据结构来建立这种情况。当然,在这种情况下,我们没有额外的空间进行克隆,所以我们需要...
5 分钟阅读
这是一个主要的数论问题,可以广泛应用于不同领域,例如密码学和代数。一个数的特定除数是能够整除该数的**所有**素数。实际上,此处要解决的问题包括...
阅读9分钟
java.nio.charset 的内置方法之一是 replace() 方法。CharsetEncoder 的替换值以字节数组的形式返回。当编码操作遇到无法映射的字符时,Java 的 CharsetEncoder 类的 replacement() 函数会检索编码器当前的替换序列。一个字节数组...
阅读 2 分钟
Java 是一种广泛使用的编程语言,其受欢迎程度在很大程度上归功于其对向后兼容性的承诺。这意味着用旧版本 Java 编写的应用程序通常可以在新版本的 Java 虚拟机(JVM)上运行而无需修改。在本节中,我们将深入探讨……
阅读 4 分钟
我们请求您订阅我们的新闻通讯以获取最新更新。
我们提供所有技术(如 Java 教程、Android、Java 框架)的教程和面试问题
G-13, 2nd Floor, Sec-3, Noida, UP, 201301, India