本文共 1467 字,大约阅读时间需要 4 分钟。
synchronized(同步)机制是Java中用于保证线程安全的关键字,其核心作用是通过 monitor对象(monitor)实现线程间的竞争与阻塞。以下从多个维度阐述synchronized的特性及其与其他锁机制的比较。
synchronized通过传入一个monitor对象,实现了对共享资源的独占访问,主要目标是:
synchronized可以修饰方法、类或代码块,具体方式如下:
public synchronized void increase() { this.i++; }public static synchronized void increase() { System.out.println("计数"); }synchronized (monitor) { ... }synchronized基于Java虚拟机中的monitor机制。其实现关键在于monitor对象的进入和退出监视器机制:
这两种操作共同实现了monitor的偏向锁和锁重入功能。
虽然两者都用于线程安全,但有显著区别:
| 对比项 | synchronized | volatile |
|---|---|---|
| 作用 | 核心锁定机制 | 保证可见性 |
| 应用范围 | 方法、类、代码块 | 让变量始终可见 |
| 安全性 | 原子性和可见性 | 只保证可见性 |
| 阻塞 | 可能造成阻塞 | 不阻塞 |
synchronized是Java内置锁,简单易用,但存在以下局限:
| 对比项 | synchronized | Lock |
|---|---|---|
| 锁释放机制 | 自动释放 | 手动释放 |
| 锁获取方式 | Banner模态 | 支持多种方式 |
| 锁类型 | 非公平、不可重入 | 可重入、可中断 |
| 性能 | 重量级锁 | 轻量级锁 |
建议在轻量级资源竞争中使用Lock,因其性能优于synchronized。
ReentrantLock是更高级的锁机制,具有synchronized的所有特性,并增强如下:
synchronized是Java中基础的线程同步机制,简单结构但适用范围广。在需要简单且全面同步的场景下,保持优势地位。对于高并发环境,推荐使用ReentrantLock。
综上所述,理解synchronized机制是掌握Java多线程开发的关键。通过合理选择不同的锁机制,开发者可以根据实际需求实现高效、线性化的多线程程序。
转载地址:http://dhvjz.baihongyu.com/