java-读写锁

作者: 萤火之森ss | 来源:发表于2018-04-15 18:36 被阅读34次

特点:在读写锁中,读锁是允许多个线程同时访问的,但是在写锁访问的时候其他企图访问读锁和写锁都是被阻塞的。

历史:在jdk5之前,假如有场景:大部分都是读的场景,写的场景很少,但是写之后的数据要对所有的读所见。

java中的读写锁是RenntrantReadWriteLock,它具有如下特点,公平性选择,重入,降级锁,但是没有升级锁。
RenntrantReadWriteLock内部的一些工具方法:
int getReadLockCount():返回当前读锁被获取的次数,总次数和线程数没关系
int getReadHoldCount():返回当前线程获取读锁的次数,
boolean isWriteLockd():判断写锁是否被获取
int getWriteHoldCont():返回当前线程获取写锁的次数

实例:

public class lock {


    static Map<String,Object> map = new HashMap<>();
    static ReentrantReadWriteLock rwl = new ReentrantReadWriteLock();
    //读锁
    static Lock r = rwl.readLock();
    //写锁
    static Lock w = rwl.writeLock();

    public static final Object get(String key){

        r.lock();
        try {
            return map.get(key);
        }finally {
            r.unlock();
        }


    }

    public static final Object put(String key,Object value){

        w.lock();
        try {
            return map.put(key,value);
        }finally {
            w.unlock();
        }
    }

    public static final void clear(){

        w.lock();
        try {
            map.clear();
        }finally {
            w.unlock();
        }
    }
}

写锁是一个重入的过程,再次获得增加写锁的状态。
如果当前线程获取写锁的时候,读锁已经被其他线程获取,则当前线程进入等待状态。
ReentrantReadWriteLock的tryAcquire方法:

protected final boolean tryAcquir(int acquire){
  Thread current = Thread.currentThread();
  //获取同步状态值 0代表没有被持有
  int  c = getState();
  //获取写状态 
  int w = exclusiveCount(c);
  if(c!=0){
    //读锁被占有了,或者持有锁线程不是当前线程
    if(w == 0 || current !=getExclusiveOwnerThread()){
      return false;
    }
    //大于最大值
    if(w + exclusiveCount(acquires) > MAX_COUNT)
      throw ...
    //否则增加状态,这里是当前线程重入了
    setState(c);
    return true;
  //
  if(writeShouldBolck() || !compareAndSetState(c,c+acquires)){
    return false;  
  }
  //当前线程获得锁
  setExclusiverOwnerThread(current);
  return ture;
}

相关文章

  • java-读写锁

    特点:在读写锁中,读锁是允许多个线程同时访问的,但是在写锁访问的时候其他企图访问读锁和写锁都是被阻塞的。 历史:在...

  • 读写锁和互斥锁 读写互斥锁,简称读写锁 mux sync.RWMutex Lock和Unlock分别对写锁进行锁定...

  • 线程同步(下)

    继上篇。这篇介绍的几种使用的较少。 读写锁 读写锁与互斥锁类似。不过读写锁允许更高的并行性。读写锁可以有三种状态:...

  • 可重入读写锁 ReentrantReadWriteLock

    读写锁分为读锁和写锁,多个线程获取读锁不互斥,读写锁、写写锁互斥。 输出

  • Java并发编程-读写锁(ReentrantReadWriteL

    章节目录 ReentrantReadWriteLock 特性 读写锁接口示例 读写锁的实现分析读写状态设计写锁的释...

  • 线程安全之读写锁

    相关API 初始化读写锁 释放读写锁 获取读锁 获取写锁 解锁 实例

  • ReadWriteLock读写锁

    1、引入ReadWriteLock读写锁 ReadWriteLock是JDK5中提供的读写分离锁。读写分离锁可以有...

  • 基于CAS的一些锁(5)- ReadWriteLock

    ReadWriteLock 读写锁。读写锁的概念其实就是共享锁和排他锁,读锁就是共享锁,写锁就是排他锁。 如何理解...

  • Go 语言的锁

    Go 语言提供两类锁: 互斥锁(Mutex)和读写锁(RWMutex)。其中读写锁(RWMutex)是基于互斥锁(...

  • 读写锁实现

    读写锁 ReentrantReadWriteLock可重入读写锁(实现ReadWriteLock接口) 使用:Re...

网友评论

    本文标题:java-读写锁

    本文链接:https://www.haomeiwen.com/subject/zkzdkftx.html