
并发编程
章 鱼
alert("hey!")
展开
-
【线程池】ScheduledThreadPool异常处理
背景某个任务类负责定时处理一些抽取数据的逻辑,通过定时线程池来实现。问题这天发现数据没有被处理,初步检查后定位到是因为放到线程池的这个任务并没有执行,而其他任务却可以正常地执行。分析梳理该任务的代码逻辑,其中因为在处理数据的过程中遗漏了对数据的合规校验,而正是因为这次残缺的数据而导致代码抛出异常。通过查找资料和demo测试,发现ScheduledThreadPool这个定时线程池对抛出异常的任务会进行挂起,此后不会再进行调用。解决在任务中对任务进行合规校验可对不可避免的异常进行捕获,避免异原创 2020-07-12 22:42:12 · 1279 阅读 · 0 评论 -
《Java并发编程实战》学习笔记(4)
第六章:任务执行大多数并发应用程序是围绕执行任务(task)进行管理的。所谓任务就是抽象、离散的工作单元(unit of work)。把一个应用程序的工作(work)分离到任务中,可以简化程序的管理;这种分离还在不同事务间划分了自然的分界线,可以方便程序在出现错误时进行恢复;同时这种分离还可以为并行工作提供一个自然的结构,有利于提高程序的并发性。在线程中执行任务理想情况下,任务是独...原创 2020-03-03 17:17:50 · 338 阅读 · 0 评论 -
《Java并发编程实战》学习笔记(3)
第四章:组合对象设计线程安全的类设计线程安全类的过程应该包括下面3个基本要素:确定对象状态是由哪些变量构成的;确定限制状态变量的不变约束;制定一个管理并发访问对象状态的策略。名词解释:先验条件(precondition):针对方法(method),它规定了在调用该方法之前必须为真的条件。例如,你无法从空队列中移除一一个条目:在你删除元素前,队列必须处于“非空”状态。后验条件(...原创 2020-02-25 16:20:54 · 332 阅读 · 0 评论 -
《Java并发编程实战》学习笔记(2)
第三章:共享对象可见性除了synchronize,同步还具有另一个重要、微妙的方面:内存可见性。我们不仅希望能够避免一个线程修改其他线程正在使用的对象的状态,而且希望确保当一个线程修改了对象的状态后,其他的线程能够真正看到改变。在一个单线程化的环境里,如果向一个变量先写入值,然后在没有写干涉的情况下读取这个变量,是可以得到相同的返回值。但是当读和写发生在不同的线程中时,情况却根本不是这样。...原创 2020-02-17 16:45:02 · 291 阅读 · 0 评论 -
《Java并发编程实战》学习笔记(1)
第一章知识点:进程是资源(CPU、内存等)分配的基本单位线程是CPU调度和分派的基本单位一个进程包括一个或多个线程1、为什么应用程序需要从单线程发展为多线程?资源利用。程序有时候需要等待外部的操作,比如输入和输出,并且在等待的时候不可能进行有价值的工作。在等待的时候,让其他的程序运行会提高效率。公平。多个用户或程序可能对系统资源有平等的优先级别。让他们通过更好的时间片方式来...原创 2020-02-12 11:47:52 · 278 阅读 · 0 评论 -
Disruptor中遇到的坑
经朋友推荐,我在项目采用lmax的disruptor无锁队列框架来实现异步记录监控统计信息。disruptor体积很小,功能强大,一路配置下来,很容易上手,而且经过测试发现确实吞吐量比blockqueue性能提升了好几个数量级。可是直到有一天突然发现好久没收到监控的统计数据了,于是检查服务,发现服务状态是正常的,而且监控的定时任务也在后台定时收集,但数据库确实没更新。于是分几个方面来排查问题:...转载 2018-08-31 16:08:48 · 3731 阅读 · 0 评论 -
并发编程之重入锁和读写锁
Java多线程中,除了sychronized关键字实现多线程之间同步互斥操作,其实还有另外一种高效的机制去完成”同步互斥”操作。即Lock对象,比synchronized关键字更为强大功能,并且有嗅探锁定,多路分支等功能。重入锁分为公平锁和非公平锁,默认非公平锁public ReentrantLock() { sync = new NonfairSync();}pri...转载 2018-08-30 23:17:07 · 446 阅读 · 0 评论 -
多线程之CountDownLatch和CyclicBarrier
一、倒计时CountDownLatchCountDownLatch是一个非常实用的多线程控制工具类,称之为“倒计时器”,它允许一个或多个线程一直等待,直到其他线程的操作执行完后再执行。举了例子:我们知道的集齐七颗龙珠就可以召唤神龙,那我们就一起召唤一下,下边我需要派7个人(7个线程)去分别去找这7颗不同的龙珠,每个人找到之后回来告诉我还需要等待的龙珠个数减1个,那么当全部的人都找到龙珠...转载 2018-08-30 16:44:48 · 576 阅读 · 0 评论 -
并发编程之线程池
为什么使用线程池有时候,系统需要处理非常多的执行时间很短的请求,如果每一个请求都开启一个新线程的话,系统就要不断的进行线程的创建和销毁,有时花在创建和销毁线程上的时间会比线程真正执行的时间还长。而且当线程数量太多时,系统不一定能受得了。使用线程池主要为了解决以下几个问题:通过重用线程池中的线程,来减少每个线程创建和销毁的性能开销。对线程进行一些维护和管理,比如定时开始,周期执行,并...转载 2018-08-29 22:23:54 · 211 阅读 · 0 评论 -
并发编程之Master-Worker模式
Master-Worker模式是常用的并发模式,核心是Master和Worker两个进程,Master接收和分配任务,各个Worker执行任务并返回结果,由Master来归纳和总结。好处是能将大任务分解为若干个小任务,提高系统的吞吐量。 代码示例:public class Master { // 1.接收任务的queue private ConcurrentLink...原创 2018-08-27 17:22:00 · 319 阅读 · 0 评论 -
多线程之Future模式
概述:Futrue模式:对于多线程,如果线程A要等待线程B的结果,那么线程A没必要等待B,直到B有结果,可以先拿到一个未来的Future,等B有结果是再取真实的结果。主要角色:Main:系统启动,调用Client发出请求Client:返回Data对象,立即返回FutureData,并开启ClientThread线程装配RealDataData:返回数据的接口FutureDa...原创 2018-08-25 22:03:40 · 1250 阅读 · 0 评论 -
多线程基础之wait和notify
wait( ),notify( ),notifyAll( )都不属于Thread类,而是属于Object类,也就是每个对象都有wait( ),notify( ),notifyAll( ) 的功能,因为每个对象都有锁,锁是每个对象的基础当需要调用以上的方法的时候,一定要对竞争资源进行加锁,如果不加锁的话,则会报 IllegalMonitorStateException 异常,也就是说需要配合sy...原创 2018-08-23 21:47:31 · 282 阅读 · 0 评论 -
Java并发系列之基础二
1. 并发编程三要素原子性:即一个不可再被分割的颗粒。在Java中原子性指的是一个或多个操作要么全部执行成功要么全部执行失败。 有序性:程序执行的顺序按照代码的先后顺序执行。(处理器可能会对指令进行重排序) 可见性:当多个线程访问同一个变量时,如果其中一个线程对其作了修改,其他线程能立即获取到最新的值。2. 线程的五大状态创建状态当用 new 操作符创建一个线程的时候 就...转载 2018-08-14 13:06:19 · 247 阅读 · 0 评论 -
Java并发系列之基础一
线程简介线程定义现代操作系统在运行一个程序时,会为其创建一个进程。例如,启动一个Java程序,操作系统就会创建一个Java进程。线程是现代操作系统调度的最小单元,也叫轻量级进程,在一个进程里可以创建多个线程,这些线程都拥有各自的计算器、堆栈和局部变量等属性,并且能够访问共享的内存变量。处理器在这些线程上高速切换,让使用者感觉到这些线程在同时执行。Java程序天生就是多线程程序,可以...转载 2018-08-14 12:42:20 · 256 阅读 · 0 评论 -
Java并发编程 - 常用容器(ConcurrentHashMap, ConcurrentLinkedQueue)
ConcurrentHashMap的实现原理与使用传统的HashMap不是线程安全的, 所以多线程进行put()和get()操作的时候可能会引发问题. 还有一个叫做HashTable的数据结构, 它使用的是synchronized来保证线程安全, 但是效率很低, 因为不能并发读.ConcurrentHashMap采用的是锁分段技术, 将数据分成一段一段存储, 然后给每一段数据配一把锁,...转载 2018-08-02 22:34:04 · 972 阅读 · 0 评论