countdownlatch

volatile关键字

吃可爱长大的小学妹 提交于 2020-01-28 20:42:38
一、简介 volatile是Java提供的一种轻量级的同步机制。Java 语言包含两种内在的同步机制:同步块(或方法)和 volatile 变量,相比于synchronized(synchronized通常称为重量级锁),volatile更轻量级,因为它不会引起线程上下文的切换和调度。但是volatile 变量的同步性较差(有时它更简单并且开销更低),而且其使用也更容易出错。 二、并发编程的3个基本概念 (1)原子性 ​ 定义: 即一个操作或者多个操作 要么全部执行并且执行的过程不会被任何因素打断,要么就都不执行。 ​ 原子性是拒绝多线程操作的,不论是多核还是单核,具有原子性的量,同一时刻只能有一个线程来对它进行操作。简而言之,在整个操作过程中不会被线程调度器中断的操作,都可认为是原子性。例如 a=1是原子性操作,但是a++和a +=1就不是原子性操作。Java中的原子性操作包括: ​ a. 基本类型的读取和赋值操作,且赋值必须是数字赋值给变量,变量之间的相互赋值不是原子性操作。 ​ b.所有引用reference的赋值操作 ​ c.java.concurrent.Atomic.* 包中所有类的一切操作 (2)可见性 ​ 定义: 指当多个线程访问同一个变量时,一个线程修改了这个变量的值,其他线程能够立即看得到修改的值。 ​ 在多线程环境下

CyclicBarrier的简单使用

走远了吗. 提交于 2020-01-25 15:47:43
通过之前的这篇博客 CountDownLatch的简单应用和实现原理 ,可以了解到, CountDownLatch实质上做的事,就是让一个线程等待多个线程 通过CountDownLatch我们可以对一些没有前后依赖的方法做到并行执行,节省大量的时间,但是这时候出现了新的需求: 现在我要做的是一个循环的操作,反复的从数据库里取出订单数据和快递单数据,然后这两个数据要进行对比,我要知道哪些订单配送失败了 思路一:在循环里反复新建CountDownLatch类,大致代码如下: public static void main ( String [ ] args ) throws InterruptedException { if ( true ) { for ( ; ; ) { CountDownLatch countDownLatch = new CountDownLatch ( 2 ) ; Thread thread1 = new Thread ( ( ) - > { try { Thread . sleep ( 2000 ) ; } catch ( InterruptedException e ) { e . printStackTrace ( ) ; } System . out . println ( "获取订单数据" ) ; countDownLatch . countDown

Java并发编程:CountDownLatch、CyclicBarrier和Semaphore

喜欢而已 提交于 2020-01-25 00:19:39
场景描述:   多线程设计过程中,经常会遇到需要等待其它线程结束以后再做其他事情的情况。 有几种方案:   1.在主线程中设置一自定义全局计数标志,在工作线程完成时,计数减1。主线程侦测该标志是否为0,一旦为0,表示所有工作线程已经完成。   2.使用Java标准的类CountDownLatch来完成这项工作,原理是一样的,计数。 CountDownLatch 一个同步辅助类,在完成一组正在其他线程中执行的操作之前,它允许一个或多个线程一直等待。 其机制是:   当多个(具体数量等于初始化CountDownLatch时的count参数的值)线程都达到了预期状态或完成预期工作时触发事件,其他线程可以等待这个事件来触发自己的后续工作。这里需要注意的是,等待的线程可以是多个,即CountDownLatch是可以唤醒多个等待的线程的。达到自己预期状态的线程会调用CountDownLatch的countDown方法,而等待的线程会调用CountDownLatch的await方法。 CountDownLatch 很适合用来将一个任务分为n个独立的部分,等这些部分都完成后继续接下来的任务,CountDownLatch 只能出发一次,计数值不能被重置。 流程图 如上图所示,当7个线程都完成latch.countDown调用后,最下面那条线程会从latch.await返回,继续执行后面的代码

java并发编程之CountDownLatch,CyclicBarrier和Semaphore

老子叫甜甜 提交于 2020-01-24 19:05:20
一、CountDownLatch CountDownLatch能够让一个线程在等待其他线程全部完成各自任务后再执行。而CountDownLatch是通过计数器来实现的,计数器的初始值即为任务的总数。 举个例子,如,同学聚会结束回家,每个人都要回各自的家,此时计数器的初始值为参加聚会的总人数,而每个人都是一个线程,每个同学到家后,都需要调用countDown方法,对计数器减一,表示完成回家的任务,当所有同学都到家后,主线程才可以执行通知班长全部到家的任务。再比如,所编写的应用程序,希望等待启动框架的线程启动完毕后再执行。 1.1 构造方法 public CountDownLatch ( int count ) { if ( count < 0 ) throw new IllegalArgumentException ( "count < 0" ) ; this . sync = new Sync ( count ) ; } CountDownLatch的构造方法需要一个count参数,代表初始任务的数量,往后每当调用一次(CountDownLatch.countDown()方法,count都减一,当count减到0的时候,调用CountDownLatch.await()方法的线程就可以执行其任务。 除此之外,CountDownLatch还有以下几个方法: 1.await(long

[转帖]Java面试通关要点汇总集

青春壹個敷衍的年華 提交于 2020-01-22 16:33:50
Java面试通关要点汇总集 https://www.zybuluo.com/Yano/note/1102942 基本功 面向对象的特征 final, finally, finalize 的区别 int 和 Integer 有什么区别 重载和重写的区别 抽象类和接口有什么区别 说说反射的用途及实现 说说自定义注解的场景及实现 HTTP 请求的 GET 与 POST 方式的区别 session 与 cookie 区别 session 分布式处理 JDBC 流程 MVC 设计思想 equals 与 == 的区别 面向对象的特征 抽象:数据抽象、逻辑抽象 封装:把过程和数据包围起来 继承:鼓励类的重用 多态:允许将子类类型赋值给父类类型的引用,将类型泛化 final, finally, finalize 的区别 final: - 变量:不可修改 - 对象:引用不可修改 - 方法:不可被重写 - 类:不可被继承 finally:异常处理的关键字,无论是否抛出异常,finally 块都会被执行 finalize:finalize()是Object的protected方法,子类可以覆盖该方法以实现资源清理工作,GC在回收对象之前调用该方法。 protected void finalize () throws Throwable { } 大致描述一下finalize流程:当对象变成(GC

Thread线程间协作

孤人 提交于 2020-01-21 21:54:26
目录 join yield CountDownLatch CyclicBarrier wait notify LockSupport Condition Conditions SynchronousQueue 线程间的交互和协作从简单到复杂有很多种方式, 下面会从最简单的join开始到使用各种方式和工具来分析. 为了辅助分析线程间的协作, 先撸一下线程的各个状态和状态间轮转的条件. 状态 描述 NEW 创建对象后start之前的状态 RUNNABLE 调用start或yield之后, 代表可以随时运行 BLOCKED 线程等待monitor enter时(等锁), 阻塞状态 WAITING 等待状态, 和阻塞不一样通常可以被interrupt TIMED_WAITING 同WAITING, 但是TIMED_WAITING有时间限制, 超时后终止TIMED_WAITING进入RUNNABLE TERMINATED 线程运行完毕或被关闭后的状态 各个状态之间的流转参考下图所示 join join可以做到最简单的线程交互, 可以让某个线程阻塞起来进入 WAITING 或 TIMED_WAITING 状态, 等另外一个线程执行完成或超时后再继续运行. 以下面代码为例, 线程A启动起来sleep两秒钟. 线程B紧随着线程A启动, 并在线程B中join线程A. 查看运行结果.

volatile关键字的作用

巧了我就是萌 提交于 2020-01-20 17:45:29
引言   昨日接了一个阿里外包的电话面试,问了一些技术问题感觉到自己是真的菜,接触Java开发已经也有一段时间,技术方面说来惭愧,一直以来只是局限于框架工具的用法,也没有进行了解其实现的原理,更重要的是一直没有归纳和总结,这次把这些问题记录下来,相关的知识点也找了一些资料学习下。 问题 1. CountDownLanch的工作原理 实现原理:计数器的值由构造函数传入,并用它初始化AQS的state值。当线程调用await方法时会检查state的值是否为0,如果是就直接返回(即不会阻塞);如果不是,将表示该节点的线程入列,然后将自身阻塞。当其它线程调用countDown方法会将计数器减1,然后判断计数器的值是否为0,当它为0时,会唤醒队列中的第一个节点,由于CountDownLatch使用了AQS的共享模式,所以第一个节点被唤醒后又会唤醒第二个节点,以此类推,使得所有因await方法阻塞的线程都能被唤醒而继续执行。   引用别人的博客里的一段话,详细请点击: Java并发包中CountDownLatch的工作原理、使用示例 题外话: 什么是 AQS(抽象的队列同步器) AbstractQueuedSynchronizer类如其名,抽象的队列式的同步器,AQS定义了一套多线程访问 共享资源的同步器框架,许多同步类实现都依赖于它,如常用的 ReentrantLock/Semaphore

多线程之异步查询汇总数据

旧时模样 提交于 2020-01-20 14:39:31
利用java异步编程的操作,将分解的sql异步执行并最终汇总数据。这里用到了CountDownLatch和ExecutorService, // 获取时间段所有天数 List<String> days = MyDateUtils.getDays(requestParams.getStartTime(), requestParams.getEndTime()); // 天数长度 int length = days.size(); // 初始化合并集合,并指定大小,防止数组越界 List<你想要的数据类型> list = Lists.newArrayListWithCapacity(length); // 初始化线程池 ExecutorService pool = Executors.newFixedThreadPool(length); // 初始化计数器 CountDownLatch latch = new CountDownLatch(length); // 查询每天的时间并合并 for (String day : days) { Map<String, Object> param = Maps.newHashMap(); // param 组装查询条件 pool.submit(new Runnable() { @Override public void run() { try

Java并发之CountDownLatch、CyclicBarrier、Semaphore使用实例

泪湿孤枕 提交于 2020-01-19 02:18:10
最近学习了Java并发编程中的CountDownLatch、CyclicBarrier、Semaphore,做个小总结。 这三个类都是java1.5中提供的一些非常有用的辅助类,用于帮助程序员实现并发编程。 CountDownLatch 背景 CountDownLatch是一个同步工具类,用来协调多个线程之间的同步,或者说起到线程之间的通信(而不是用作互斥的作用)。 CountDownLatch能够使一个线程在等待另外一些线程完成各自工作之后,再继续执行。使用一个计数器进行实现。计数器初始值为线程的数量。当每一个线程完成自己任务后,计数器的值就会减一。当计数器的值为0时,表示所有的线程都已经完成一些任务,然后在CountDownLatch上等待的线程就可以恢复执行接下来的任务。 countDownLatch是在java1.5被引入,跟它一起被引入的工具类还有CyclicBarrier、Semaphore、concurrentHashMap和BlockingQueue。 存在于java.util.cucurrent包下。 概念 countDownLatch这个类使一个线程等待其他线程各自执行完毕后再执行。 是通过一个计数器来实现的,计数器的初始值是线程的数量。每当一个线程执行完毕后,计数器的值就-1,当计数器的值为0时,表示所有线程都执行完毕,然后在闭锁上等待的线程就可以恢复工作了。

Java jdbc多线程写数据入库

*爱你&永不变心* 提交于 2020-01-18 23:33:07
一、背景: 今天下午在做模拟数据时发现200万条数据写入数据库,时间很长,思考通过使用多线程进行数据批量写入操作。 二、实现代码: 1、数据库工具类 package com . general . data . utils ; import java . sql . Connection ; import java . sql . DriverManager ; import java . sql . ResultSet ; import java . sql . ResultSetMetaData ; import java . sql . SQLException ; import java . sql . Statement ; import java . util . ArrayList ; import java . util . HashMap ; import java . util . List ; import java . util . Map ; import java . util . concurrent . CountDownLatch ; /** * @description 数据库工具类 * @author 砌墙民工 * @date 2020年1月18日 上午12:56:40 * @version 1.0 * * 修改信息说明: *