
并发编程
文章平均质量分 92
水墨之白
悟已往之不谏,知来者之可追!
展开
-
线程的状态与中断
一、线程的状态位于java.lang.Thread.State枚举类中状态名称说明NEW初始状态RUNNABLE线程处于就绪状态或者正在被调度BLOCK阻塞状态,尝试获取同步锁WAITTING等待状态,调用wait,join方法TIME_WAITTING调用sleep(timeout)、wait(timeout)等操作进入超时等待状态...原创 2019-04-20 14:54:37 · 698 阅读 · 0 评论 -
线程池的异常处理
一、Java线程异常机制在java多线程程序中,所有线程都不允许抛出未捕获的checked exception,也就是说各个线程需要自己把自己的checked exception处理掉,run方法上面进行了约束,不可以抛出异常(throws Exception)public class Task implements Runnable { @Override public vo...原创 2019-11-04 23:11:56 · 4612 阅读 · 0 评论 -
线程间的通信
多线程并发执行,它们之间不是相互独立的个体,而是相互通信协作,更好的利于cpu时间片完成工作等待通知机制与生产消费模型,最经典的例子:生产者向队列发送消息,消费者负责消费,如何协调它们各自的速率呢,队列full 和 empty时应该怎么解决呢可以使用while语句不断轮询,查看队列是否满了或者为空,根据条件做相应操作使用等待通知机制,empty时通知消费者暂停消费,full时通知生产者暂...原创 2019-07-29 19:41:00 · 232 阅读 · 0 评论 -
synchronized关键字原理
一、synchronizedsynchronized关键字的三种使用方式:同步普通方法,锁时当前对象同步静态方法,锁的是当前 Class 对象同步块,锁的是 () 中的对象实现原理:JVM基于进入和退出Monitor对象来实现方法同步和代码块同步,代码块同步是使用monitorenter和monitorexit指令实现的,而方法同步JVM规范里并没有详细说明具体实现是在编译之后在...原创 2019-04-23 21:04:50 · 209 阅读 · 0 评论 -
Java内存模型
Java内存模型背景计算机的处理器运行速度远远快于内存的读写速度,为了不让CPU一直等待内存,在CPU和内存之间加上高速缓存,同时在单核处理器上可以运行多线程,更加充分的发挥处理器的优势。并发: CPU通过给每个线程分配CPU时间片来实现这个机制,时间片是CPU分配给各个线程的时间,因为时间片非常短,所以CPU通过不停地切换线程执行,让我们感觉多个线程是同时执行的。缓存: 将运算需要使用到的...原创 2019-04-24 19:36:20 · 200 阅读 · 0 评论 -
理解Executor
引言:Java的线程既是工作单元,也是执行机制。我们需要把这两者分开,让工作单元包括Runnable和Callable,而执行机制由Executor框架提供。Executor框架主要由3大部分组成:任务。包括被执行任务需要实现的接口:Runnable接口或Callable接口任务的执行。包括任务执行机制的核心接口Executor,以及继承自Executor的ExecutorServic...原创 2019-09-04 00:33:36 · 261 阅读 · 0 评论 -
线程池的原理及使用
一. 线程池的优点 1:降低资源消耗。通过重复利用已创建的线程降低线程创建和销毁造成的消耗。2:提高响应速度。当任务到达时,任务可以不需要等到线程创建就能立即执行。 3:提高线程的可管理性。线程是稀缺资源,如果无限制地创建,不仅会消耗系统资源, 还会降低系统的稳定性,使用线程池可以进行统一分配、调优和监控。但是,要做到合理利用 线程池,必须对其实现原理了如指掌。 二. 线...原创 2018-07-28 15:30:22 · 272 阅读 · 0 评论 -
深入浅出阻塞队列原理
ArrayBlockingQueue:基于数组实现的一个阻塞队列,在创建ArrayBlockingQueue对象时必须制定容量大小。并且可以指定公平性与非公平性,默认情况下为非公平的,即不保证等待时间最长的队列最优先能够访问队列。LinkedBlockingQueue:基于链表实现的一个阻塞队列,在创建LinkedBlockingQueue对象时如果不指定容量大小,则默认大小为Intege...原创 2019-09-03 00:42:41 · 383 阅读 · 0 评论 -
ConcurrentHashMap在jdk1.7和jdk1.8的实现
一、ConcurrentHashMap介绍众所周知,ConcurrentHashMap是用来在多线程的情况下代替HashMap。HashMap在高并发的情况,写入数据,引起扩容,在扩容的过程中可能形成环形链表,读数据时形成死循环。ConcurrentHashMap是使用分段锁技术,将集合的读写划分到局部。二、jdk1.7的实现jdk1.7中采用Segment + HashEntry的方式...原创 2019-04-22 21:21:10 · 429 阅读 · 0 评论 -
理解设计模式—模板方法与AQS
定义:封装一个模板结构,将具体内容延迟到子类去实现将多个类共有的方法和功能抽取出来,封装到抽象类,对于这些公有方法(模板方法)使用final修饰,需要通过子类扩张的定义成抽象(abstract)方法,有子类实现其自有特性。JDK AQS 抽象队列同步器就是一个构建锁和同步器的模板,使用它可以构建ReentrantLock(独占型),CountDownLacth(共享型),Semaphore(共...原创 2019-07-10 16:05:06 · 1400 阅读 · 0 评论 -
深度解析ReentrantLock和AQS
一、什么是AQS?AQS: AbstractQueuedSynchronizer,队列同步器,它是构建锁或者其他同步组件的基础框架,它包含了state变量、加锁线程、等待队列等并发中的核心组件。二、必备知识点:该图片来源石衫老师公众号AQS使用一个int类型的成员变量state来表示同步状态,state > 0表示获取锁,state == 0表示无锁状态AQS使用一个内部变量记...原创 2019-05-10 19:43:05 · 406 阅读 · 0 评论 -
ThreadLocal使用详解
一、ThreadLocal的使用场景为线程中一个本地变量的副本提供索引,ThreadLocal可以用来维护与当前线程相关的一些上下文,不需要通过每个方法调用将其作为参数传递。使用threadLocal一定要注意内存泄漏,否则还是建议定义context类,保存每个线程自身上下文二、ThreadLocal分析API四个主要方法:public T get() { }public void ...原创 2019-03-23 16:41:50 · 2841 阅读 · 0 评论 -
理解Future和FutureTask
一、Future简介Future就是对于具体的Runnable或者Callable任务的执行结果进行取消、查询是否完成、获取结果。必要时可以通过get方法获取执行结果,该方法会阻塞直到任务返回结果。当我们在使用线程池的时候,我们怎么知道阻塞队列的任务的执行情况呢?Future为我们提供了可以获取线程返回值的方法。同时如果这个任务如果执行时间很长,我们可以在提交任务后立刻返回Future,主线...原创 2019-05-24 20:38:25 · 244 阅读 · 0 评论 -
任务调度实现
任务调度定义:任务调度是基于给定时间点,给定时间间隔或者给定执行次数自动执行任务。TimerTimer 是jdk提供的一个定时器工具,会在主线程之外起一个单独线程执行指定的计划任务。public class TimerTest extends TimerTask { private String jobName; public TimerTest(String jobN...原创 2018-12-28 20:46:04 · 716 阅读 · 0 评论