读写分离——读写锁ReadWriteLock

读写锁顾名思义分离读操作和写操作,可以有效的减少锁竞争以提高系统的性能。读写锁提升性能的地方主要在读读操作(读操作不会改变数据的一致性和完整性),而读写、写写、写读操作之间则会互斥造成阻塞。因此,读写锁应用场景适用于读操作次数大于写操作次数,读操作次数远大于写操作次数时,系统性能提升最明显。

ReadWriteLock接口定义了获取读锁和写锁两个方法,接下来对比串行的重入锁,来测试读写锁性能:

public class ReadWriteLockDemo {

    /**
     * 定义重入锁,对比性能
     */
    private static Lock lock = new ReentrantLock();

    /**
     * 定义读写锁,测试读写分离操作效率
     */
    private static ReentrantReadWriteLock readWriteLock = new ReentrantReadWriteLock();
    private static ReadLock readLock = readWriteLock.readLock();
    private static WriteLock writeLock = readWriteLock.writeLock();

    /**
     * 全局读写变量
     */
    private int value;

    /**
     * 模拟读操作
     * @param lock 使用何种锁
     * @return
     * @throws InterruptedException
     */
    public Object handleRead(Lock lock) throws InterruptedException{
        try {
            lock.lock();
            Thread.sleep(1000);
            return value;
        } finally {
            lock.unlock();
        }
    }

    /**
     * 模拟写操作
     * @param lock 锁
     * @param index 写入值
     * @throws InterruptedException
     */
    public void handleWrite(Lock lock, int index) throws InterruptedException{
        try {
            lock.lock();
            Thread.sleep(1000);
            value = index;
        } finally {
            lock.unlock();
        }
    }

    /**
     * 创建读写两个线程实例,构建多线程模拟
     * @param args
     */
    public static void main(String[] args) {
        final ReadWriteLockDemo demo = new ReadWriteLockDemo();

        Runnable readRunnable = new Runnable() {

            @Override
            public void run() {
                try {
                    int num = (int)demo.handleRead(readLock);
                    //int num = (int)demo.handleRead(lock);
                    System.out.println(num);
                } catch (InterruptedException e) {
                    e.printStackTrace();
                }
            }
        };

        Runnable writeRunnable = new Runnable() {

            @Override
            public void run() {
                try {
                    demo.handleWrite(writeLock, new Random().nextInt());
                    //demo.handleWrite(lock, new Random().nextInt());
                    System.out.println("write now ...");
                } catch (InterruptedException e) {
                    e.printStackTrace();
                }
            }
        };

        for (int i = 0; i < 18; i++) {
            new Thread(readRunnable).start();
        }

        for (int i = 18; i < 20; i++) {
            new Thread(writeRunnable).start();
        }
    }
}
性能提升主要是在于读操作时,重入锁串行读取耗时多,而改用读写锁之后读操作变为并发读,节省了时间。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
Redisson是一个基于Redis的分布式锁和并发工具的Java客户端。它提供了一种实现读写锁的机制,可以在分布式环境下同步访问共享资源。 要使用Redisson实现读写锁,首先需要引入Redisson的依赖。在Maven项目,可以在pom.xml文件添加以下依赖: ```xml <dependency> <groupId>org.redisson</groupId> <artifactId>redisson</artifactId> <version>3.16.1</version> </dependency> ``` 接下来,在代码通过RedissonClient对象获取读写锁实例。可以使用以下代码来创建RedissonClient: ```java Config config = new Config(); config.useSingleServer().setAddress("redis://localhost:6379"); RedissonClient redisson = Redisson.create(config); ``` 然后,可以使用redisson对象来获取读写锁实例,并使用该实例进行读写操作。以下是一个使用Redisson实现读写锁的示例: ```java RLock readWriteLock = redisson.getReadWriteLock("myReadWriteLock"); RLock readLock = readWriteLock.readLock(); RLock writeLock = readWriteLock.writeLock(); // 读操作 readLock.lock(); try { // 执行读操作 } finally { readLock.unlock(); } // 写操作 writeLock.lock(); try { // 执行写操作 } finally { writeLock.unlock(); } ``` 在上面的示例,首先通过redisson对象获取了一个名为"myReadWriteLock"的读写锁实例。然后,可以使用读锁和写锁来控制对共享资源的读写操作。在读操作和写操作之前分别调用了lock()方法获取锁,在操作完成后调用了unlock()方法释放锁。 需要注意的是,Redisson的读写锁是可重入的,也就是说同一个线程可以多次获取同一个锁而不会造成死锁。同时,Redisson还提供了其他一些高级特性,如锁的等待超时、锁的可断等,可以根据具体需求进行配置和使用。

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值