本章主要讲并发线程的常见的两种锁。重入锁和读写锁

一:重入锁(ReentrantLock)

    概念:重入锁,在需要进行同步的代码加锁,但最后一定不要忘记释放锁,否则会造成锁永远不能释放,其他线程进不了

    代码解析:

1         实例化:Lock lock = new ReentrantLock();
2
3         锁定:lock .lock();
4
5         释放锁:lock.unlock();

    代码:

        

      

 1 private Lock lock = new ReentrantLock();
2
3       public void method1(){
4           try {
5             lock.lock();
6             System.out.println("当前线程:" + Thread.currentThread().getName() + "进入method1..");
7             Thread.sleep(1000);
8             System.out.println("当前线程:" + Thread.currentThread().getName() + "退出method1..");
9             Thread.sleep(1000);
10             } catch (InterruptedException e) {
11               e.printStackTrace();
12             } finally {
13
14             lock.unlock();
15           }
16         }

    Condition类:配合重入锁,阻塞和通知,不需要配合synchronized使用,比较灵活,支持多个线程锁定,同时通知全部。

          阻塞和通知:

         

1                 private Lock lock = new ReentrantLock();
2
3           private Condition condition = lock.newCondition();

         

                阻塞:condition.await();    

          通知:condition.signal(); 

           通知全部:condition.signalall()

   Lock/Condition其他方法和用法:

        

                     Lock lock=new  ReentrantLock(boolean isFair);

            tryLock():尝试获得锁,返回false/true

            tryLock():在给定的时间内尝试获得锁,获得结果用 true/false表示。

            isFair():返回是否是公平锁  true/false

            isLocked():返回是否锁定

            getHoldCount():返回当前线程保持此锁的个数,或者说表示调用了lock()的次数

            lockinterruptibly():优先响应中断的锁

            getQueueLength():返回正在等待获取此锁定的线程数。 

            getWaitQueueLength():返回等待与锁定相关的给定条件Condition的线程数

            hasQueueThread(Thread t):查询指定的线程是否正在等待此锁

            hasQueueThreads():查询是否有线程正在等待此锁

            hasWaiters():查询是否有线程正在等待与此锁定有关的condition条件

二:读写锁(ReentrantReadWriteLock)

     概念:其核心就是读写分离的锁,在读多写少情况下,性能远高于重入锁 。口诀:读读共享,写写互斥,读写互斥

     代码解析:

        实例化:       

         

                private ReentrantReadWriteLock rwLock = new ReentrantReadWriteLock();
          private ReadLock readLock = rwLock.readLock(); //获取到读锁
          private WriteLock writeLock = rwLock.writeLock(); //获取到写锁

        

    

java架构《并发线程高级篇四》的更多相关文章

  1. java架构《并发线程高级篇一》

    本章主要记录讲解并发线程的线程池.java.util.concurrent工具包里面的工具类. 一:Executor框架: Executors创建线程池的方法: newFixedThreadPool( ...

  2. java架构《并发线程高级篇二》

    本章主要记录讲解并发线程的线程池.使用Executor框架自定义线程池. 自定义线程池使用Queue队列所表示出来的形式: 1 ArrayBlockingQueue<Runnable>(3 ...

  3. java架构《并发线程高级篇三》

    本章主要介绍和讲解concurrent.util里面的常用的工具类. 一.CountDownLatch使用:(用于阻塞主线程) 应用场景 :通知线程休眠和运行的工具类,是wait和notify的升级版 ...

  4. Java高并发 -- 线程池

    Java高并发 -- 线程池 主要是学习慕课网实战视频<Java并发编程入门与高并发面试>的笔记 在使用线程池后,创建线程变成了从线程池里获得空闲线程,关闭线程变成了将线程归坏给线程池. ...

  5. Java高并发--线程安全策略

    Java高并发--线程安全策略 主要是学习慕课网实战视频<Java并发编程入门与高并发面试>的笔记 不可变对象 发布不可变对象可保证线程安全. 实现不可变对象有哪些要注意的地方?比如JDK ...

  6. Java并发-线程池篇-附场景分析

    作者:汤圆 个人博客:javalover.cc 前言 前面我们在创建线程时,都是直接new Thread(): 这样短期来看是没有问题的,但是一旦业务量增长,线程数过多,就有可能导致内存异常OOM,C ...

  7. Java高并发与多线程(四)-----锁

    今天,我们开始Java高并发与多线程的第四篇,锁. 之前的三篇,基本上都是在讲一些概念性和基础性的东西,东西有点零碎,但是像文科科目一样,记住就好了. 但是本篇是高并发里面真正的基石,需要大量的理解和 ...

  8. Java之创建线程的方式四:使用线程池

    import java.util.concurrent.ExecutorService;import java.util.concurrent.Executors;import java.util.c ...

  9. java架构《并发线程中级篇》

    java多线程的三大设计模式 本章主要记录java常见的三大设计模式,Future.Master-Worker和生产者-消费者模式. 一.Future模式 使用场景:数据可以不及时返回,到下一次实际要 ...

随机推荐

  1. VIM和正则表达式

    1.VIM 1.1vim简介 vim是一款强大的文本编辑器,它和 vi 使用方法一致,但功能更为强大.官网:www.vim.org.中文手册:http://vimcdoc.sourceforge.ne ...

  2. hive优化之小文件合并

    文件数目过多,会给HDFS带来压力,并且会影响处理效率,可以通过合并Map和Reduce的结果文件来消除这样的影响: set hive.merge.mapfiles = true ##在 map on ...

  3. 进制及其字符串之间互转——C#

    本文介绍进制数转进制数,及每个进制对应的字符串 一.首先进制数转进制数(int-->int) 1.二进制数与十进制数互转: (1)二进制数转十进制数:还没找到 (2)十进制数转二进制数:目前还没 ...

  4. Redis缓存篇(四)缓存异常

    这一节,我们来学习一下缓存异常.缓存异常有四种类型,分别是缓存和数据库的数据不一致.缓存雪崩.缓存击穿和缓存穿透. 下面通过了解这四种缓存异常的原理和应对方法. 缓存和数据库的数据不一致 缓存和数据库 ...

  5. shell实现99乘法表

    #!/usr/bin/env sh for ((x=1;x<10;x++));do for ((y=1;x>=y;y++));do printf "${y}x${x}=$(exp ...

  6. IndexedDB详解

    目录 简介 IndexedDB简介 IndexedDB的使用 IndexedDB的浏览器支持 创建IndexedDB indexdb中的CURD 使用游标cursor 简介 IndexedDB是一种在 ...

  7. Head First 设计模式 —— 11. 组合 (Composite) 模式

    思考题 我们不仅仅要支持多个菜单,升值还要支持菜单中的菜单.你如何处理这个新的设计需求? P355 [提示]在我们的新设计中,真正需要以下三点: P354 我们需要某种属性结构,可以容纳菜单.子菜单和 ...

  8. mmall商城购物车模块总结

    购物车模块的设计思想 购物车的实现方式有很多,但是最常见的就三种:Cookie,Session,数据库.三种方法各有优劣,适合的场景各不相同.Cookie方法:通过把购物车中的商品数据写入Cookie ...

  9. mmall商城用户模块开发总结

    1.需要实现的功能介绍 注册 登录 用户名校验 忘记密码 提交问题答案 重置密码 获取用户信息 更新用户信息 退出登录 目标: 避免横向越权,纵向越权的安全漏洞 MD5明文加密级增加的salt值 Gu ...

  10. 十八:SQL注入之堆叠及绕WAF

    堆叠查询注入 (双查询注入) stacked injections(堆叠注入)从名词的含义就可以看到是一堆的SQL语句一起执行,而在真实的运用中也是这样的,我们知道在mysql中,主要是命令行中,每一 ...