Count_Down

java多线程(2)---生命周期、线程通讯

依然范特西╮ 提交于 2020-07-27 13:03:12
java生命周期、线程通讯 一、生命周期 有关线程生命周期就要看下面这张图,围绕这张图讲解它的方法的含义,和不同方法间的区别。 1、yield()方法 yield() 让当前正在运行的线程回到就绪 ,以允许 具有相同优先级 的其他线程获得运行的机会。但是,实际中无法保证yield()达到让步的目的,因为,让步的线程可能被线程调度程序再次选中。 同时yield()不会放弃锁资源,所以有可能会出现死锁。 2、wait和sleep方法的区别 1)第一个很重要的区别就是, wait方法必须正在同步环境 下使用,比如synchronized方法或者同步代码块。如果你不在同步条件下使用,会抛出IllegalMonitorStateException异常。另外,sleep方法不需要再同步条件下调用,你可以任意正常的使用。 2)第二个区别是,wait方法用于和定义于 Object类 的,而sleep方法操作于当前线程,定义在java.lang. Thread类 里面。 3)第三个区别是,调用 wait()的时候方法会释放当前持有的锁 ,而sleep方法不会释放任何锁。 3、wait和sleep方法使用场景 (1)wait方法定义在Object类里面,所有对象都能用到, 一般wait()和notify()方法或notifyAll使用于线程间的通信 。 (2)sleep()方法用于暂停当前线程的执行。

Java 开发手册 (阿里巴巴开发手册)

ε祈祈猫儿з 提交于 2020-05-08 19:01:05
Java 开发手册 版本号 制定团队 更新日期 备注 1.4.0 阿里巴巴集团技术团队 2018.5.20 增加设计规约(详尽版) 一、编程规约 (一) 命名风格 1. 【强制】代码中的命名均不能以下划线或美元符号开始,也不能以下划线或美元符号结束。 反例:_name / __name / $name / name_ / name$ / name__ 2. 【强制】代码中的命名严禁使用拼音与英文混合的方式,更不允许直接使用中文的方式。 说明:正确的英文拼写和语法可以让阅读者易于理解,避免歧义。注意,即使纯拼音命名方式 也要避免采用。 正例:alibaba / taobao / youku / hangzhou 等国际通用的名称,可视同英文。 反例:DaZhePromotion [打折] / getPingfenByName() [评分] / int 某变量 = 3 3. 【强制】类名使用 UpperCamelCase 风格,但以下情形例外:DO / BO / DTO / VO / AO / PO / UID 等。 正例:MarcoPolo / UserDO / XmlService / TcpUdpDeal / TaPromotion 反例:macroPolo / UserDo / XMLService / TCPUDPDeal / TAPromotion 4. 【强制】方法名

CountDownLatch的理解和使用

 ̄綄美尐妖づ 提交于 2020-05-07 11:51:35
在笔者想要了解Thrift时候,找到一个博主写的系统间通信技术的架构设计,在了解和学习的过程中遇到很多小问题和基础知识,自己还是不够清楚,就查询和总结下。 因为笔者也都是从网上找的一些资料,好的资料笔者都是自己收敲一遍,这样觉得能够加深下印象,引发更多的思考,毕竟很多时候笔者感觉自己都是七秒的记忆。 在第一篇文章中遇到了一个CountDownLatch同步计数器,当计数器数值减为0时,所有受其影响而等待的线程将会被激活,这样保证模拟并发请求的真实性。 CountDownLatch概念 CountDownLatch是一个同步工具类,用来协调多个线程之间的同步,或者说起到线程之间的通信(而不是用作互斥的作用)。 CountDownLatch能够使一个线程在等待另外一些线程完成各自工作之后,再继续执行。使用一个计数器进行实现。计数器初始值为线程的数量。当每一个线程完成自己任务后,计数器的值就会减一。当计数器的值为0时,表示所有的线程都已经完成一些任务,然后在CountDownLatch上等待的线程就可以恢复执行接下来的任务。 CountDownLatch的用法 CountDownLatch典型用法:1、某一线程在开始运行前等待n个线程执行完毕。将CountDownLatch的计数器初始化为new CountDownLatch(n),每当一个任务线程执行完毕,就将计数器减1

基于SpringMVC+Spring+MyBatis实现秒杀系统【客户端交互】

て烟熏妆下的殇ゞ 提交于 2020-04-28 23:13:20
前言 该篇主要实现客户端和服务的交互。在第一篇概况里我已经贴出了业务场景的交互图片。 客户端交互主要放在seckill.js里来实现。页面展现基于jsp+jstl来实现。 准备工作 1、配置web.xml。web.xml里配置springmvc前端控制器时需要把spring托管的3个xml全部加载。分别是spring-dao.xml、spring-service.xml、spring-web.xml。 < web-app xmlns ="http://xmlns.jcp.org/xml/ns/javaee" xmlns:xsi ="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation ="http://xmlns.jcp.org/xml/ns/javaee http://xmlns.jcp.org/xml/ns/javaee/web-app_3_1.xsd" version ="3.1" metadata-complete ="true" > < display-name > Archetype Created Web Application </ display-name > <!-- 配置前端控制器 --> < servlet > < servlet-name > dispatcherServlet </

来,带你鸟瞰 Java 中的并发框架!

[亡魂溺海] 提交于 2020-04-27 15:09:55
作者:唐尤华 https://dzone.com/articles/a-birds-eye-view-on-java-concurrency-frameworks-1 1. 为什么要写这篇文章 几年前 NoSQL 开始流行的时候,像其他团队一样,我们的团队也热衷于令人兴奋的新东西,并且计划替换一个应用程序的数据库。 但是,当深入实现细节时,我们想起了一位智者曾经说过的话:“细节决定成败”。最终我们意识到 NoSQL 不是解决所有问题的银弹,而 NoSQL vs RDMS 的答案是:“视情况而定”。 类似地,去年RxJava 和 Spring Reactor 这样的并发库加入了让人充满激情的语句,如异步非阻塞方法等。为了避免再犯同样的错误,我们尝试评估诸如 ExecutorService、 RxJava、Disruptor 和 Akka 这些并发框架彼此之间的差异,以及如何确定各自框架的正确用法。 本文中用到的术语在这里有更详细的描述。 2. 分析并发框架的示例用例 3. 快速更新线程配置 在开始比较并发框架的之前,让我们快速复习一下如何配置最佳线程数以提高并行任务的性能。 这个理论适用于所有框架,并且在所有框架中使用相同的线程配置来度量性能。 对于内存任务,线程的数量大约等于具有最佳性能的内核的数量,尽管它可以根据各自处理器中的超线程特性进行一些更改。 例如,在8核机器中

JAVA concurrency -- CyclicBarrier 与 CountDownLatch 源码详解

你离开我真会死。 提交于 2020-04-26 11:10:47
JAVA concurrency -- CyclicBarrier 与 CountDownLatch 源码详解 概述 CountDownLatch和CyclicBarrier有着相似之处,并且也常常有人将他们拿出来进行比较,这次,笔者试着从源码的角度分别解析这两个类,并且从源码的角度出发,看看两个类的不同之处。 CountDownLatch CountDownLatch从字面上来看是一个计数工具类,实际上这个类是用来进行多线程计数的JAVA方法。 CountDownLatch内部的实现主要是依靠AQS的共享模式。当一个线程把CountDownLatch初始化了一个count之后,其他的线程调用await就会阻塞住,直到其他的线程一个一个调用countDown方法进行release操作,把count的值减到0,即把同步锁释放掉,await才会进行下去。 Sync 内部主要还是实现了一个继承自AQS的同步器Sync。Sync源码如下: private static final class Sync extends AbstractQueuedSynchronizer { private static final long serialVersionUID = 4982264981922014374L; // 构造方法,参数是count的数值 Sync(int count) { //

并发工具——CyclicBarrier

≡放荡痞女 提交于 2020-04-23 23:00:18
本博客系列是学习并发编程过程中的记录总结。由于文章比较多,写的时间也比较散,所以我整理了个目录贴(传送门),方便查阅。 并发编程系列博客传送门 CyclicBarrier简介 CyclicBarrier 也是JDK并发包中提供的一个辅助并发工具类。 CyclicBarrier 的作用是让一组线程互相等待,直到这组线程中所有的线程 都到达同步点(完成某个动作,体现到API上就是调用CyclicBarrier的await方法),这些线程才会继续往下工作。 在相互等待的线程被释放后, CyclicBarrier 可以被循环使用。这个从这个类的名字中的 Cyclic 就可以看出。 CyclicBarrier的构造函数 public CyclicBarrier(int parties) { this(parties, null); } public CyclicBarrier(int parties, Runnable barrierAction) { if (parties <= 0) throw new IllegalArgumentException(); this.parties = parties; this.count = parties; this.barrierCommand = barrierAction; } CyclicBarrier提供了两个构造函数

JAVA concurrency -- CyclicBarrier 与 CountDownLatch 源码详解

那年仲夏 提交于 2020-04-23 22:00:04
概述 CountDownLatch 和 CyclicBarrier 有着相似之处,并且也常常有人将他们拿出来进行比较,这次,笔者试着从源码的角度分别解析这两个类,并且从源码的角度出发,看看两个类的不同之处。 CountDownLatch CountDownLatch 从字面上来看是一个计数工具类,实际上这个类是用来进行多线程计数的JAVA方法。 CountDownLatch 内部的实现主要是依靠 AQS 的共享模式。当一个线程把 CountDownLatch 初始化了一个 count 之后,其他的线程调用 await 就会阻塞住,直到其他的线程一个一个调用 countDown 方法进行 release 操作,把 count 的值减到0,即把同步锁释放掉, await 才会进行下去。 Sync 内部主要还是实现了一个继承自 AQS 的同步器 Sync 。 Sync 源码如下: private static final class Sync extends AbstractQueuedSynchronizer { private static final long serialVersionUID = 4982264981922014374L; // 构造方法,参数是count的数值 Sync(int count) { // 内部使用state来存储count setState

多线程高并发编程(5) -- CountDownLatch、CyclicBarrier源码分析

我怕爱的太早我们不能终老 提交于 2020-04-23 00:18:22
一.CountDownLatch   1.概念 public CountDownLatch( int count) {//初始化 if (count < 0) throw new IllegalArgumentException("count < 0" ); this .sync = new Sync(count); }    CountDownLatch是一个同步工具类,用来协调多个线程之间的同步,或者说起到线程之间的通信(而不是用作互斥的作用)。   CountDownLatch能够使一个线程在等待另外一些线程完成各自工作之后,再继续执行。使用一个计数器进行实现。计数器初始值为线程的数量。当每一个线程完成自己任务后,计数器的值就会减一。当计数器的值为0时,表示所有的线程都已经完成一些任务,然后在CountDownLatch上等待的线程就可以恢复执行接下来的任务。   下面有A、B、C、D4个线程同时执行,A是主线程,B、C、D是子线程,A先开始执行后阻塞,等待子线程全部执行结束才继续执行剩下的任务。   2.用法    1)、某一线程在开始运行前等待n个线程执行完毕。将CountDownLatch的计数器初始化为new CountDownLatch(n),每当一个任务线程执行完毕,就将计数器减1 countdownLatch.countDown(),当计数器的值变为0时

获得多个子线程的结果,面试和工作中你会遇到的多线程问题

♀尐吖头ヾ 提交于 2020-04-22 08:24:03
昨天项目组里的一名毕业生询问我,如何知道异步线程的返回值,这让我不觉想起来了两年前我参加招商系一个公司的面试,在技术二面时,面试官出过一道这样的编程题。 题目大概含义是:我有一个需求是为了得到一个求和结果,但是这个结果,需要两个耗时大概1s 左右计算功能的结果相加得到的,麻烦用线程帮我实现,方案越多越好,然后默默的递过来纸和笔~~ 首先我们分析一下,这个题目肯定是需要多个线程执行的,我们要抓住这个题目的关键点 : 主线程必须要等2个子线程执行完,拿到子线程的结果进行相加,得到最终结果。 其实,实现这个题目的方式有很多种,以我现在的观点来看,面试官应该主要考察如下三点: 1. 多线程相关的基本知识点理解是否透彻,thread没有返回值如何处理。 2. 思维是否活跃,知识面是否广,能想出多少种方案 3. 写代码是否规范 当年too young,我只写出了方案一和方案二的部分代码(由于平时敲代码自动提示的比较多,所以很多单词敲不出来)。 不知道面试官当时是怎样的心境,反正最终是拿到offer了,不过因为个人原因,去了另一家公司。 接下来,我将两个数相加,相个数相乘模仿两个耗时的计算功能,用三种方案来解决这个问题。(我面试的时候写的代码可没有下面这么详细) 方案一: 使用thread.join()实现 java中的join方法可以控制线程的执行顺序,这个方案主要是考察线程的join方法原理