zoukankan      html  css  js  c++  java
  • java并发:读写锁ReadWriteLock

    在没有写操作的时候,两个线程同时读一个资源没有任何问题,允许多个线程同时读取共享资源。

    但是如果有一个线程想去写这些共享资源,就不应该再有其它线程对该资源进行读或写。

    简单来说,多个线程同时操作同一资源时,“读读共存,写写不共存,读写不共存”。

    读写锁的锁定规则如下:
    获得读锁后,其它线程可获得读锁而不能获取写锁
    获得写锁后,其它线程既不能获得读锁也不能获得写锁

    .

    import java.util.concurrent.locks.ReadWriteLock;
    import java.util.concurrent.locks.ReentrantReadWriteLock;
    
    /**
     * 读写锁。
     */
    public class ReadWriteLockDemo {
    
        public static void main(String[] args) {
              ReadWrite readWrite=new ReadWrite();
    
              for(int i=0;i<5;i++) {
                  new Thread(new Runnable() {
                      @Override
                      public void run() {
                          readWrite.get();
                      }
                  }).start();
    
                  new Thread(new Runnable() {
                      @Override
                      public void run() {
                          readWrite.set();
                      }
                  }).start();
              }
        }
    }
    
    
       class  ReadWrite {
          private ReadWriteLock  readWriteLock=new ReentrantReadWriteLock();
    
           /**
            * 进行"读"操作
            */
          public void get() {
              try {
                  readWriteLock.readLock().lock();
                  System.out.println("线程"+Thread.currentThread().getName()+"进行读取。");
                  Thread.sleep(2*1000);
              }catch (InterruptedException e) {
                  e.printStackTrace();
              }finally {
                  readWriteLock.readLock().unlock();
                  System.out.println("线程"+Thread.currentThread().getName()+"读取完毕。");
              }
          }
    
           /**
            * 进行"写"操作
            */
          public  void  set(){
              try {
                  readWriteLock.writeLock().lock();
                  System.out.println("线程"+Thread.currentThread().getName()+"进行写入。");
                  Thread.sleep(2*1000);
              }catch (InterruptedException e) {
                  e.printStackTrace();
              }finally {
                  readWriteLock.writeLock().unlock();
                  System.out.println("线程"+Thread.currentThread().getName()+"写入完毕。");
              }
          }
       }

    示例结果如下:

    线程Thread-0进行读取。
    线程Thread-0读取完毕。
    线程Thread-1进行写入。
    线程Thread-1写入完毕。
    线程Thread-5进行写入。
    线程Thread-5写入完毕。
    线程Thread-3进行写入。
    线程Thread-3写入完毕。
    线程Thread-7进行写入。
    线程Thread-7写入完毕。
    线程Thread-9进行写入。
    线程Thread-9写入完毕。
    线程Thread-2进行读取。
    线程Thread-4进行读取。
    线程Thread-6进行读取。
    线程Thread-8进行读取。
    线程Thread-2读取完毕。
    线程Thread-6读取完毕。
    线程Thread-8读取完毕。
    线程Thread-4读取完毕。
  • 相关阅读:
    POJ 2752 Seek the Name, Seek the Fame
    POJ 2406 Power Strings
    KMP 算法总结
    SGU 275 To xor or not to xor
    hihocoder 1196 高斯消元.二
    hihoCoder 1195 高斯消元.一
    UvaLive 5026 Building Roads
    HDU 2196 computer
    Notions of Flow Networks and Flows
    C/C++代码中的笔误
  • 原文地址:https://www.cnblogs.com/expiator/p/9374598.html
Copyright © 2011-2022 走看看