返回
Java多线程高级知识:揭秘 Synchronized 重量级锁的互斥原理
Android
2023-10-14 10:59:57
前言
在上一篇文章中,我们分析了偏向锁和轻量级锁的演变过程。本篇将继续分析重量级锁的原理。通过本文,您将了解到:
- ObjectMonitor 的运用
- 重量级锁的获取过程
- 重量级锁的释放过程
- 重量级锁的优缺点
- 重量级锁的适用场景
重量级锁的互斥原理
重量级锁是 Java 中最传统的锁机制,也是开销最大的锁机制。当线程需要获取重量级锁时,它需要先进入内核态,然后内核会将该线程挂起,直到锁被释放。当锁被释放后,内核会将该线程唤醒,并让它继续执行。
重量级锁的互斥原理是基于操作系统的互斥机制实现的。操作系统内核提供了一系列的系统调用,允许用户进程对共享资源进行互斥访问。当一个进程需要访问共享资源时,它可以调用系统调用来获取对该资源的独占访问权。当该进程完成对共享资源的访问后,它需要调用系统调用来释放对该资源的独占访问权。
在 Java 中,重量级锁是通过 synchronized
来实现的。当一个线程需要获取重量级锁时,它可以使用 synchronized
关键字来修饰要访问的共享资源。当该线程获取到重量级锁后,其他线程将无法访问该共享资源,直到该线程释放重量级锁。
重量级锁的优缺点
重量级锁具有以下优点:
- 安全性高: 重量级锁是 Java 中最安全的锁机制。当一个线程获取到重量级锁后,其他线程将无法访问该共享资源,从而保证了共享资源的安全性。
- 可靠性强: 重量级锁的可靠性很高。当一个线程获取到重量级锁后,其他线程将无法访问该共享资源,从而保证了共享资源的可靠性。
重量级锁也具有以下缺点:
- 性能低: 重量级锁的性能较低。当一个线程需要获取重量级锁时,它需要先进入内核态,然后内核会将该线程挂起,直到锁被释放。当锁被释放后,内核会将该线程唤醒,并让它继续执行。这个过程会消耗大量的 CPU 时间,从而降低了程序的性能。
- 可伸缩性差: 重量级锁的可伸缩性较差。当一个程序有多个线程同时访问共享资源时,重量级锁会严重影响程序的性能。这是因为重量级锁是全局锁,当一个线程获取到重量级锁后,其他线程将无法访问该共享资源,从而导致其他线程被阻塞。
重量级锁的适用场景
重量级锁适用于以下场景:
- 对安全性要求较高的场景: 当共享资源对安全性要求较高时,可以使用重量级锁来保护共享资源。例如,银行账户的余额就是一个对安全性要求较高的共享资源,可以使用重量级锁来保护银行账户的余额。
- 对可靠性要求较高的场景: 当共享资源对可靠性要求较高时,可以使用重量级锁来保护共享资源。例如,数据库中的数据就是一个对可靠性要求较高的共享资源,可以使用重量级锁来保护数据库中的数据。
总结
重量级锁是 Java 中最传统的锁机制,也是开销最大的锁机制。重量级锁具有安全性高、可靠性强等优点,但也具有性能低、可伸缩性差等缺点。重量级锁适用于对安全性要求较高或对可靠性要求较高的场景。