java 读写锁的一个应用场景

场景:多线程下对Arraylist的add,set,get,remove的操作

由于他们都不是原子的,且都依赖于size(index),这些操作会或多或少的影响size(index),所以一次只能有一个操作。其他操作等待。

在原来,使用synchronized时,上面4个操作只能互斥的实现。但我们发现,其实get与get可以共享访问。

这是靠synchronized是无法实现的,因为它只能维护一把锁。

此时就需要读写锁了

package com.deng.f;

import java.util.ArrayList;
import java.util.concurrent.locks.ReentrantReadWriteLock;

/**
 * @author :deng
 * @version :1.0
 * @description :
 * @since :1.8
 */
public class MyArrayList<E> {
    private ArrayList<E> list = new ArrayList<E>();
    ReentrantReadWriteLock lock = new ReentrantReadWriteLock();
    ReentrantReadWriteLock.ReadLock readLock = lock.readLock();
    ReentrantReadWriteLock.WriteLock writeLock = lock.writeLock();


    public void add(E element) {
        try {
            writeLock.lock();
            list.add(element);
        } finally {
            writeLock.unlock();
        }
    }

    public void removeLast() {
        try {
            writeLock.lock();
            if(list.size()!=0){
                list.remove(list.size() - 1);
            }
        } finally {
            writeLock.unlock();
        }

    }

    public void set(int index, E element) {
        try {
            writeLock.lock();
            list.set(index, element);
        } finally {
            writeLock.unlock();
        }

    }

    public E get(int index) {
        try {
        	// 读锁
            readLock.lock();
            return list.get(index);
        } finally {
            readLock.unlock();
        }
    }

}

  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
Java中的锁主要有以下几种: 1. synchronized锁:synchronized是Java中最基本的锁,它可以用来保证同一时刻只有一个线程访问共享资源,它可以用在方法上或代码块中。synchronized锁适用于线程数量较少且访问频率不高的情况,在高并发的情况下性能会有所下降。 2. ReentrantLock锁:ReentrantLock是Java中可重入锁的实现,它提供了更多的灵活性和功能,例如可中断锁、公平锁、多条件变量等。ReentrantLock适用于线程数量较多且访问频率较高的情况,在高并发的情况下性能表现更好。 3. ReadWriteLock锁:ReadWriteLock是Java读写锁的实现,它允许多个线程同时读取共享资源,但只允许一个线程写入共享资源。ReadWriteLock适用于读操作比写操作频繁的情况,在高并发的情况下性能表现更好。 4. StampedLock锁:StampedLock是Java8中新增的一种锁,它可以用于替代ReadWriteLock,提供更高的并发性能。StampedLock适用于读操作比写操作频繁的情况,在高并发的情况下性能表现更好。 5. LockSupport锁:LockSupport是Java中线程阻塞工具类,可以用于实现线程的挂起和唤醒操作。LockSupport适用于需要对线程进行精确控制的情况,在高并发的情况下性能表现更好。 以上锁的使用场景并不是绝对的,具体使用时需要根据具体情况进行选择。一般来说,如果只是简单的同步操作,使用synchronized即可;如果需要更高的灵活性和功能,可以考虑使用ReentrantLock或StampedLock;如果需要读写分离,可以考虑使用ReadWriteLock。

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值