Java几种锁介绍?在什么场景下使用?

1. synchronized (内置锁/监视器锁)

  • 场景: 适用于简单的同步需求,比如方法或代码块级别的同步。
  • 特点: 隐式获取和释放锁,可重入,非公平,默认情况下可能导致线程阻塞。
  • 代码示例:
Java
1public class Counter {
2    private int count = 0;
3    
4    public synchronized void increment() {
5        count++;
6    }
7    
8    public synchronized int getCount() {
9        return count;
10    }
11}

2. ReentrantLock (可重入锁 - JUC包提供)

  • 场景: 当需要更细粒度的控制,如公平锁、尝试获取锁、锁打断等特性时使用。
  • 特点: 显式获取和释放锁,支持公平锁和非公平锁,可重入。
  • 代码示例:
Java
1import java.util.concurrent.locks.ReentrantLock;
2
3public class Counter {
4    private final ReentrantLock lock = new ReentrantLock();
5    private int count = 0;
6    
7    public void increment() {
8        lock.lock();
9        try {
10            count++;
11        } finally {
12            lock.unlock();
13        }
14    }
15    
16    public int getCount() {
17        lock.lock();
18        try {
19            return count;
20        } finally {
21            lock.unlock();
22        }
23    }
24}

3. ReadWriteLock (读写锁 - JUC包提供)

  • 场景: 当存在大量的读操作和少量的写操作时,为了提高并发效率。
  • 特点: 提供读锁(共享锁)和写锁(独占锁),允许多个读锁同时存在,但写锁与其他锁互斥。
  • 代码示例:
Java
1import java.util.concurrent.locks.ReadWriteLock;
2import java.util.concurrent.locks.ReentrantReadWriteLock;
3
4public class DataContainer {
5    private final ReadWriteLock lock = new ReentrantReadWriteLock();
6    private volatile String data;
7    
8    public void writeData(String newData) {
9        lock.writeLock().lock();
10        try {
11            data = newData;
12        } finally {
13            lock.writeLock().unlock();
14        }
15    }
16    
17    public String readData() {
18        lock.readLock().lock();
19        try {
20            return data;
21        } finally {
22            lock.readLock().unlock();
23        }
24    }
25}

4. StampedLock (JUC包提供)

  • 场景: 提供了读写锁的功能,还增加了乐观读锁和升级降级锁的功能,适用于复杂的并发控制场景。
  • 特点: 支持读、写、乐观读等多种模式,具有更高的灵活性但使用复杂度也较高。
  • 代码示例:
Java
1import java.util.concurrent.locks.StampedLock;
2
3public class Point {
4    private double x, y;
5    private final StampedLock sl = new StampedLock();
6    
7    void move(double deltaX, double deltaY) {
8        long stamp = sl.writeLock();
9        try {
10            x += deltaX;
11            y += deltaY;
12        } finally {
13            sl.unlockWrite(stamp);
14        }
15    }
16    
17    double distanceFromOrigin() {
18        long stamp = sl.tryOptimisticRead();
19        double currentX = x, currentY = y;
20        if (!sl.validate(stamp)) {
21            stamp = sl.readLock();
22            try {
23                currentX = x;
24                currentY = y;
25            } finally {
26                sl.unlockRead(stamp);
27            }
28        }
29        return Math.sqrt(currentX * currentX + currentY * currentY);
30    }
31}

5.乐观锁/悲观锁(概念层面,非具体Java类,但在编程逻辑中体现)

  • 场景: 数据库操作或非阻塞同步逻辑中。
  • 特点:
    • 悲观锁: 认为并发操作一定会冲突,直接加锁阻止其他线程访问,如数据库行锁。
    • 乐观锁: 认为并发操作不会冲突,仅在提交更新时检查数据版本,如使用版本号或时间戳验证数据是否被修改。
  • 代码示例(乐观锁思想,非直接API):
Java
1public class OptimisticCounter {
2    private int value;
3    private int version;
4    
5    public synchronized boolean incrementIfUnchanged() {
6        if (version != Thread.currentThread().getVersion()) {
7            return false; // 数据已被修改
8        }
9        value++;
10        version++;
11        return true;
12    }
13    
14    // 版本号获取逻辑需自行实现,此处简化处理
15    public int getVersion() {
16        return version;
17    }
18}
  • 12
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
Java 最常用的设计模式主要有以下几种: 1. 单例模式:用于确保一个类只有一个实例,并且提供一个全局访问点。适用于需要全局控制某个资源或服务的场景。 2. 工厂模式:用于创建对象,提供一个统一的接口来创建对象,而不需要直接调用其构造函数。适用于需要动态创建对象的场景。 3. 观察者模式:用于一对多的对象依赖关系,当一个对象的状态发生变化时,所有依赖它的对象都会得到通知。适用于需要实现对象间松耦合的场景。 4. 装饰器模式:用于动态地给一个对象添加一些额外的职责,而不需要修改其实现。适用于需要扩展对象功能,但又不想影响其原始实现的场景。 5. 策略模式:用于定义一组算法,将每个算法都封装起来,并且使它们之间可以互换。适用于需要在运行时动态地选择算法的场景。 6. 适配器模式:用于将一个类的接口转换成客户端所期望的另一个接口,从而使原本不兼容的类可以协同工作。适用于需要让不兼容的接口协同工作的场景。 7. 模板方法模式:用于定义一组算法的骨架,并将一些步骤延迟到子类实现。适用于需要在不同的子类实现相同的算法流程的场景。 总之,不同的设计模式适用于不同的场景,需要根据具体需求来选择使用。在实际开发,合理地应用设计模式可以提高代码的可读性、可维护性和可扩展性。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值