Rust嵌入式与TS类型体操:2026年开发者技术雷达周报
2026/10/22 4:20:00
今天我们来聊聊Java中的锁机制
在单线程程序中,所有代码按顺序执行,不会出现资源竞争的问题;但在多线程并发场景下,多个线程同时访问共享资源(如全局变量、数据库连接、文件等)时,会出现竞态条件,导致数据不一致。锁是解决多线程并发访问共享资源的工具,本质是给共享资源加独占权限,保证多线程对共享资源的互斥访问,解决线程安全问题。
这是 Java 提供的原生关键字。它像是一个全自动洗衣机,你只需要把衣服丢进去(加上关键字),剩下的 JVM 帮你搞定。
特点:
public class SynchronizedUsage { // 1. 修饰实例方法:锁是当前对象(this) public synchronized void instanceMethod() {} // 2. 修饰静态方法:锁是当前类的Class对象 public static synchronized void staticMethod() {} // 3. 修饰代码块:锁是指定的对象(灵活) public void codeBlock() { // 锁对象可以是this、Class对象、自定义对象 synchronized (SynchronizedUsage.class) { // 临界区代码 } } }它是java.util.concurrent.locks包下的一个类。它像是一个手动档汽车,更灵活,但也更考验车技。
特点:
Lock lock = new ReentrantLock(); lock.lock(); // 手动加锁 try { // 临界区代码 } finally { lock.unlock(); // 必须在 finally 里手动释放,否则会造成死锁 }Java 中的锁可以从多个维度分类,这些分类并非互斥,而是从不同视角描述锁的特性。
这是一种设计思想,并非具体的锁实现。
这是 synchronized 的锁升级机制,JVM 为了提升锁性能,根据线程竞争的程度来动态调整适应,锁的升级是不可逆的。
自旋锁
当线程获取锁失败时,不立即阻塞挂起,而是循环重试(自旋)一段时间,看是否能获取到锁。
自适应自旋
JDK 1.6 后引入,自旋次数不再固定,而是根据「前一次自旋的结果」「锁持有者的状态」动态调整:
这是 JVM 的自动优化手段,无需开发者手动操作。