zoukankan      html  css  js  c++  java
  • WriteLock ReadLock

    读写锁:分为读锁和写锁,多个读锁不互斥,读锁与写锁互斥,这是由jvm自己控制的,你只要上好相应的锁即可。如果你的代码只读数据,可以很多人同时读,但不能同时写,那就上读锁;如果你的代码修改数据,只能有一个人在写,且不能同时读取,那就上写锁。总之,读的时候上读锁,写的时候上写锁!

    ReentrantReadWriteLock会使用两把锁来解决问题,一个读锁,一个写锁

    线程进入读锁的前提条件:没有其他线程的写锁

    package cn.itcast.lesson12;
    
    import java.io.ObjectOutputStream.PutField;
    import java.util.Random;
    import java.util.concurrent.locks.ReentrantLock;
    import java.util.concurrent.locks.ReentrantReadWriteLock;
    
    import org.omg.CORBA.PUBLIC_MEMBER;
    
    public class ReadWriteLockTest {
    
     public static void main(String[] args) {
      final Queue3 q3 = new Queue3();
    
      for (int i=0; i < 3; i++) {
       new Thread() {
        public void run() {
         while (true) {
          q3.get();
         }
        }
       }.start();
    
       new Thread() {
        public void run() {
         while (true) {
          //传入一个data值
          q3.put(new Random().nextInt(10000));
         }
        }
       }.start();
      }
     }
    }
    class Queue3{
     
     private Object data = null;//共享數據,只能有一个线程能写该数据,但有多个线程能读该数据
     private ReentrantReadWriteLock rw1 = new ReentrantReadWriteLock();
     
     public void get(){ 
      rw1.readLock().lock();
       System.out.println(Thread.currentThread().getName()+" be ready to read data!");
       try{
        Thread.sleep((long) (Math.random()*1000));
       }catch (Exception e) {
        e.printStackTrace();
       }
       System.out.println(Thread.currentThread().getName()+"have read data: " + data);
      rw1.readLock().unlock(); 
     } 
     
     public void put(Object data){ 
      rw1.writeLock().lock();
       System.out.println(Thread.currentThread().getName()+" be ready to write data!");
       try{
        Thread.sleep((long) (Math.random()*1000));
       }catch (Exception e) {
        e.printStackTrace();
       }
       this.data = data;
       System.out.println(Thread.currentThread().getName()+"have write data: "+ data);
      rw1.writeLock().unlock();
     }
    }

    打印

    Thread-0 be ready to read data!
    Thread-2 be ready to read data!
    Thread-0have read data: null
    Thread-2have read data: null
    Thread-1 be ready to write data!
    Thread-1have write data: 8157
    Thread-3 be ready to write data!
    Thread-3have write data: 5388
    Thread-3 be ready to write data!
    Thread-3have write data: 3672
    Thread-3 be ready to write data!
    Thread-3have write data: 5668
    Thread-3 be ready to write data!
    Thread-3have write data: 3150
    Thread-3 be ready to write data!
    Thread-3have write data: 4848
    Thread-3 be ready to write data!
    Thread-3have write data: 8036
    Thread-3 be ready to write data!
    Thread-3have write data: 3333
    Thread-3 be ready to write data!
    Thread-3have write data: 5873
    Thread-3 be ready to write data!
    Thread-3have write data: 5840
    Thread-3 be ready to write data!
  • 相关阅读:
    DC中为什么要用Uniquify?
    hdu 1596 find the safest road
    hdu2112 HDU Today
    hdu 2066 一个人的旅行
    poj 3026 Borg Maze
    poj 1979 Red and Black
    poj 1321 棋盘问题
    hdu 1010 Tempter of the Bone
    hdu 4861 Couple doubi
    codeforces584B Kolya and Tanya
  • 原文地址:https://www.cnblogs.com/wjw334/p/4317645.html
Copyright © 2011-2022 走看看