Java 线程安全(四)-- ReentrantLock

本文探讨了Java中ReentrantReadWriteLock实现的数据安全,对比synchronized,重点讲解了读写锁如何处理读写操作并发,以及在异常处理中的最佳实践。通过四种并发场景分析,理解何时使用读写锁提高性能。
摘要由CSDN通过智能技术生成

除了 synchronized,Java 中还有别的方式来保证数据资源安全

public class ReadWriteLockTest {

    private int x = 0;

    ReentrantLock reentrantLock = new ReentrantLock();
    
    private void count() {
        reentrantLock.lock();
        x++;
        reentrantLock.unlock();
    }
}

count 方法中 通过 lockunlock 来执行加锁和解锁来保证数据安全

但是我们不能保证在 lockunlock 之间的代码不会抛出异常,如果抛出异常,则 unlock 永远得不到执行,就会永远处于锁住的状态

所以说

public class ReadWriteLockTest {

    private int x = 0;

    ReentrantLock reentrantLock = new ReentrantLock();

    private void count() {
        reentrantLock.lock();
        try {
            x++;
        } finally {
            reentrantLock.unlock();
        }
    }
}

到此,我们同步一个概念,每个线程对数据都有两个操作:读、写,两个线程就有四种情况,两个线程随机进行操作的时候,哪些组合是被允许同时存在,哪些是不行的呢?

线程1线程2结果
可以
不行
不行
不行

对于 synchronized 来说,在同时都的时候,他就没必要加锁,加了锁性能就降低了

更改代码

public class ReadWriteLockTest {

    private int x = 0;

    ReentrantReadWriteLock lock = new ReentrantReadWriteLock();
    Lock readLock = lock.readLock();
    Lock writeLock = lock.writeLock();

    private void count() {
        writeLock.lock();
        try {
            x++;
        } finally {
            writeLock.unlock();
        }
    }
    
    private void get() {
        readLock.lock();
        try {
            System.out.println(x + "");
        } finally {
            readLock.unlock();
        }
    }
}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值