it编程 > 编程语言 > Java

Java中锁的全面解析之类型、使用场景、优缺点及实现方式(示例代码)

14人参与 2026-01-27 Java

java中锁的全面解析:类型、使用场景、优缺点及实现方式

在多线程编程中,锁是保证数据一致性和线程安全的核心机制。java 提供了丰富的锁机制来应对不同的并发场景。本文将从锁的基本概念出发,详细讲解 java 中常见的锁类型、它们的使用场景、优缺点以及底层实现原理,并通过代码示例帮助读者深入理解。

1. 锁的基本概念

锁是一种同步机制,用于控制多个线程对共享资源的访问。当一个线程获取锁后,其他线程必须等待该锁被释放才能继续执行,从而避免竞态条件(race condition)。

2. java 中常见的锁类型

2.1 互斥锁(mutex lock)

特点:
常见实现:
代码示例:使用 synchronized
public class counter {
    private int count = 0;
    // 同步方法,使用对象锁(this)
    public synchronized void increment() {
        count++;
    }
    // 同步代码块,使用指定对象锁
    public void decrement() {
        synchronized (this) {
            count--;
        }
    }
    public int getcount() {
        return count;
    }
}
优点:
缺点:

2.2 可重入锁(reentrant lock)

特点:
代码示例:使用 reentrantlock
import java.util.concurrent.locks.reentrantlock;
public class reentrantexample {
    private final reentrantlock lock = new reentrantlock();
    private int count = 0;
    public void increment() {
        lock.lock();
        try {
            count++;
            // 可以再次获取锁(可重入)
            if (count == 1) {
                system.out.println("thread " + thread.currentthread().getname() + " is re-entering the lock.");
            }
        } finally {
            lock.unlock();
        }
    }
    public int getcount() {
        lock.lock();
        try {
            return count;
        } finally {
            lock.unlock();
        }
    }
}
优点:
缺点:

2.3 读写锁(readwritelock)

特点:
常见实现:reentrantreadwritelock
代码示例:读写锁的应用
import java.util.concurrent.locks.readwritelock;
import java.util.concurrent.locks.reentrantreadwritelock;
public class readwriteexample {
    private final readwritelock lock = new reentrantreadwritelock();
    private string data = "default";
    // 读操作:多个线程可同时读
    public string readdata() {
        lock.readlock().lock();
        try {
            system.out.println(thread.currentthread().getname() + " is reading data: " + data);
            return data;
        } finally {
            lock.readlock().unlock();
        }
    }
    // 写操作:独占访问,其他读写均被阻塞
    public void writedata(string newdata) {
        lock.writelock().lock();
        try {
            system.out.println(thread.currentthread().getname() + " is writing data: " + newdata);
            data = newdata;
        } finally {
            lock.writelock().unlock();
        }
    }
}
优点:
缺点:

2.4 原子锁(atomic lock)

特点:
常见类:atomicinteger,atomicreference,stampedlock(分段锁)
代码示例:使用 atomicinteger
import java.util.concurrent.atomic.atomicinteger;
public class atomiccounter {
    private final atomicinteger count = new atomicinteger(0);
    public void increment() {
        count.incrementandget(); // cas 操作,原子递增
    }
    public int getcount() {
        return count.get();
    }
}
优点:
缺点:

2.5 stampedlock(戳记锁)

特点:
代码示例:stampedlock 用法
import java.util.concurrent.locks.stampedlock;
public class stampedlockexample {
    private final stampedlock stampedlock = new stampedlock();
    private double x, y;
    // 乐观读:不加锁,先尝试读取,失败则升级为悲观读
    public double distancefromorigin() {
        long stamp = stampedlock.tryoptimisticread();
        double currentx = x, currenty = y;
        // 检查是否在读期间发生了写操作(版本变化)
        if (!stampedlock.validate(stamp)) {
            stamp = stampedlock.readlock();
            try {
                currentx = x;
                currenty = y;
            } finally {
                stampedlock.unlockread(stamp);
            }
        }
        return math.sqrt(currentx * currentx + currenty * currenty);
    }
    // 写操作:独占锁
    public void move(double deltax, double deltay) {
        long stamp = stampedlock.writelock();
        try {
            x += deltax;
            y += deltay;
        } finally {
            stampedlock.unlockwrite(stamp);
        }
    }
}
优点:
缺点:

3. 锁的使用场景总结

锁类型适用场景推荐程度
synchronized简单同步,小范围临界区⭐⭐⭐⭐⭐
reentrantlock需要超时、中断、公平性控制⭐⭐⭐⭐☆
reentrantreadwritelock读多写少的共享数据⭐⭐⭐⭐☆
atomicxxx简单计数器、状态标志⭐⭐⭐⭐⭐
stampedlock极高读性能需求,读多写少⭐⭐⭐☆☆

4. 锁的底层实现原理(简述)

5. 最佳实践建议

  1. 优先使用 synchronized,除非有特殊需求。
  2. 避免在 finally 块外调用 unlock(),防止死锁。
  3. 读写锁适用于读多写少的场景,避免“写饥饿”。
  4. 原子类适合简单操作,复杂逻辑仍需锁保护。
  5. stampedlock 适合高性能读场景,但需谨慎使用。

6. 结语

锁是 java 并发编程的核心,合理选择锁类型能极大提升程序性能与稳定性。掌握不同锁的特点与适用场景,是成为一名高级 java 工程师的必经之路。希望本文能为你提供清晰的指导!

到此这篇关于java中锁的全面解析之类型、使用场景、优缺点及实现方式(示例代码)的文章就介绍到这了,更多相关java锁使用内容请搜索代码网以前的文章或继续浏览下面的相关文章希望大家以后多多支持代码网!

(0)

您想发表意见!!点此发布评论

推荐阅读

Java中锁分类及在什么场景下使用

01-27

SpringBoot + Redis 实现API接口限流的几种方法

01-27

SpringBoot接口防抖的5种高效方案

01-27

MyBatis-Plus 默认不更新null的4种方法

01-27

Java中实现Word和TXT之间互相转换的实用教程

01-27

一文带你搞懂Java中Error和Exception的区别

01-27

猜你喜欢

版权声明:本文内容由互联网用户贡献,该文观点仅代表作者本人。本站仅提供信息存储服务,不拥有所有权,不承担相关法律责任。 如发现本站有涉嫌抄袭侵权/违法违规的内容, 请发送邮件至 2386932994@qq.com 举报,一经查实将立刻删除。

发表评论