Java多线程:ReentrantReadWriteLock读写锁的使用_Ubuntu_青云站长教程网
欢迎来到站长教程网!
  • 秒到短信接口 免费试用
  • 微信支付宝接口 秒结算
  • 中文网站排名|申请加入
  • 搜索引擎全站查询
  • 查询移动网站权重数据
  • 海外主机 台湾公司直销
  • Ubuntu

    当前位置:主页 > 服务器教程 > Ubuntu >

    Java多线程:ReentrantReadWriteLock读写锁的使用

    时间:2019-10-10|栏目:Ubuntu|点击:
  • Lock比传统线程模型中的synchronized方式更加面向对象,与生活中的锁类似,锁本身也应该是一个对象。两个线程执行的代码片段要实现同步互斥的效果,它们必须用同一个Lock对象。

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

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

    线程进入读锁的前提条件:没有其他线程的写锁,没有写请求或者有写请求,但调用线程和持有锁的线程是同一个。

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

    Java多线程:一道阿里面试题的分析与应对

    Java1.5后的多线程框架

    Java多线程和同步的理解

    Java中两种实现多线程方式的对比分析

    Java利用多线程计算目录数据大小

    Java多线程向数据库写入数据

    总结这个锁机制的特性:

    (a).重入方面其内部的WriteLock可以获取ReadLock,但是反过来ReadLock想要获得WriteLock则永远都不要想。

    (b).WriteLock可以降级为ReadLock,顺序是:先获得WriteLock再获得ReadLock,然后释放WriteLock,这时候线程将保持Readlock的持有。反过来ReadLock想要升级为WriteLock则不可能,为什么?参看(a),呵呵.

    (c).ReadLock可以被多个线程持有并且在作用时排斥任何的WriteLock,而WriteLock则是完全的互斥。这一特性最为重要,因为对于高读取频率而相对较低写入的数据结构,使用此类锁同步机制则可以提高并发量。

    (d).不管是ReadLock还是WriteLock都支持Interrupt,语义与ReentrantLock一致。

    (e).WriteLock支持Condition并且与ReentrantLock语义一致,而ReadLock则不能使用Condition,否则抛出UnsupportedOperationException异常。

    代码典例:

    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();
     }
    }

    结果浏览:

    Java多线程:ReentrantReadWriteLock读写锁的使用

    结果分析:.ReadLock可以被多个线程持有并且在作用时排斥任何的WriteLock,而WriteLock则是完全的互斥。这一特性最为重要,因为对于高读取频率而相对较低写入的数据结构,使用此类锁同步机制则可以提高并发量。

    上一篇:Java多线程经典案例

    栏    目:Ubuntu

    下一篇:Java实战应用:MyBatis实现单表的增删改

    本文标题:Java多线程:ReentrantReadWriteLock读写锁的使用

    本文地址:http://www.jh-floor.com/fuwuqijiaocheng/Ubuntu/86928.html

    广告投放 | 联系我们 | 版权申明

    重要申明:本站所有的文章、图片、评论等,均由网友发表或上传并维护或收集自网络,属个人行为,与本站立场无关。

    如果侵犯了您的权利,请与我们联系,我们将在24小时内进行处理、任何非本站因素导致的法律后果,本站均不负任何责任。

    联系QQ:888888 | 邮箱:888888#qq.com(#换成@)

    Copyright © 2002-2017 青云站长教程网 版权所有 琼ICP备xxxxxxxx号