
java并发编程相关知识
java技术栈
wangle965235568
程序员的眼里,不仅有代码和bug,还有诗与远方和妹子
展开
-
java.util.concurrent并发学习总结(本章节目录)
为了加深学习能力和后来复习,总结了自己学习java.util.concurrent包的一些笔记,欢迎同学们进行阅读和给出批评建议。一、线程基础1、操作系统进程与线程之定义及区别2、java线程的共享与协作、synchronized使用3、线程间共享于协作-等待通知机制、等待超时机制二、线程并发工具类1、fork/join2、countdownlatch、cyclebarrier3、...原创 2020-04-16 16:05:43 · 239 阅读 · 0 评论 -
8、实战项目-性能优化实战
一、需求解析为学生考试后从题库中抽取题目生成大量的离线练习册文档并打印。题目在数据库中存储形式,平均长度800字节:“下图是Diameter协议中的那部分?</p><img src=“http://......./......./...../01.jpg”></img>存在的问题一份PDF文档的生成平均时长在50~55秒左右,耗时太久,一个年级有20...原创 2020-04-15 22:24:46 · 284 阅读 · 0 评论 -
7、并发任务执行框架
一、需求分析举例互联网教育中,会定期为每个班级或者年级的学生生成近期成绩考核的execl表单用来分析教育的质量,为每个学生生成表单是一个比较费时间的操作,假如一个任务需要3s,如果需要给一个年级1000名学生批量生成,单线程耗时可能会超过1小时,响应已经非常慢了。对于不熟悉java并发编程的开发人员或者刚开始接触java的小伙伴可能不会使用并发来解决类似的问题,这时候就需要提供一种并发框架来...原创 2020-04-12 23:08:31 · 605 阅读 · 0 评论 -
6.2 并发安全-性能和思考、线程安全的单例模式
一、性能和思考前言:使用并发的目的是要提高性能,引入多线程之后,其实会带来其他额外开销,如线程间的协作、增加的上下文的切换、线程的创建和销毁、线程的调度等等。过度的或对多线程的使用不当会导致多线程甚至没有多线程的效率高。衡量应用程序性能的标准:服务时间、延迟时间(多块)、吞吐量(处理能力的指标、完成工作的多少)、可伸缩性等。对于服务器应用程序:可伸缩性、吞吐量这个方面往往是比较看重的。开发...原创 2020-04-11 16:03:02 · 165 阅读 · 0 评论 -
6.1 并发安全-什么是线程安全、如何保证、死锁(以及解决)、活锁(以及解决)
一、线程安全的定义如果多线程使用一个类,并且不管多线程如何使用和调度,这个类总是保证正确的行为,那么这个类就是线程安全的。类的线程安全的表现为:操作的原子性内存的可见性如果不做正确的同步,多线程共享状态的情况下就会产生线程不安全的情况二、如何保证类的线程安全栈封闭所有的变量都是在方法内部声明的,这些方法都处于各自的栈帧当中,其他线程是不可见的让类变的不可变1、加fi...原创 2020-04-11 13:09:29 · 344 阅读 · 0 评论 -
5、深入理解java线程池实现原理、合理配置
一、什么是线程池、为什么要使用线程池概念存放一组线程的容器就是线程池作用可以降低资源的消耗。降低线程创建和销毁的资源提高响应速度,可以省去线程创建和销毁的时间提高线程的可管理性二、实现一个自己的线程池线程池所需要的组件1、保存线程的容器2、保存任务的队列(使用阻塞队列即可)3、线程能够接受外部的任务4、线程池能运行外部的任务package cn.enjoy.contr...原创 2020-04-06 20:10:51 · 188 阅读 · 0 评论 -
4.2 java并发容器 concurrentSkipListMap、concurrentSkipListSet、写时复制容器、阻塞队列、延时订单的实现
一、concurrentSkipListMap、concurrentSkipListSetconcurrentSkipListMap、concurrentSkipListSet是两个有序的容器,可以理解为是treeMap和treeSet的并发版本skipList是一种跳表,是以空间换时间的一种机制,数据结构如下图所显示2、concurrentLinkedQueue无界非阻塞队列, li...原创 2020-04-05 00:00:11 · 253 阅读 · 0 评论 -
4.1 java并发容器 - concurrentHashMap
一、HashMap为什么是线程不安全的问题主要出现是hashmap的扩容操作的rehash操作上。void transfer(Entry[] newTable, boolean rehash) { int newCapacity = newTable.length; for (Entry<K,V> e : table) { w...原创 2020-04-04 17:20:28 · 161 阅读 · 0 评论 -
3.3 深入分析理解AQS实现原理
一、前言什么是AQS,以java中的lock作为引入点(对于lock不太了解的可以看我总结的另一篇博文:Java内置锁、显示锁、可重入锁、读写锁)。大家有没有想过,当多线程并发的时候,当竞争失败的锁是如何实现等待以及被唤醒的呢?,AQS我们可以理解为就是解决这个问题的。AQS的全称是AbstractQueuedSynchronizer,它提供了一个FIFO队列,可以看作是一个用来实现同步锁以及...原创 2020-03-30 00:09:15 · 251 阅读 · 0 评论 -
1.1 进程与线程之*定义*及*区别*
进程与线程的定义及区别 一、进程 1.概念及理解:一个运行着一个或多个线程的地址空间和这些线程所需要的系统资源(机器指令,数据,堆栈等)称其为进程。ps:个人理解:一个程序执行起来的一个过程就为进程。是系统分配资源和调度的基本单位。 linux系统中会在进程之间共享程序代码和系统函数库,所以在内存中只有代码的一份副本。 2.进程的状态:进程一般有三种状态:运行,阻塞,挂起。进程拥有唯一的标识符原创 2017-10-23 17:11:30 · 264 阅读 · 0 评论 -
3.2 内置锁、显示锁、可重入锁、读写锁
一、显示锁1、synchronized和lock辨析Java中的synchronized是一种内置锁,其中加锁解锁的顺序已经被固化,并且没有提供一些其他可供选择的操作,java还提供了一种显示锁lock,它提供了一系列的方法供我们使用:可以尝试获取锁,超时获取锁、获取锁可以被中断,如果使用锁时有以上3中业务需求,则需要使用lock,否则使用synchronized即可。2、Reentrant...原创 2020-03-28 17:27:15 · 494 阅读 · 0 评论 -
3.1 原子操作CAS
一、原子操作1、概念原子操作就是在执行某一操作时,不会被打断。不会存在中间态,所以就不会存在并发引起的数据不一致问题。对于arm来说,单条汇编指令都是原子的,多核smp也是,因为有总线仲裁所以cpu可以单独占用总线直到指令结束,多核系统中的原子操作通常使用内存栅障(memory barrier)来实现,即一个CPU核在执行原子操作时,其他CPU核必须停止对内存操作或者不对指定的内存进行操作,...原创 2020-03-27 23:20:32 · 484 阅读 · 0 评论 -
2.4线程并发工具-Callable、Future和FutureTask原理+源码解析
一、Callable、Future和FutureTask概述1、Callable和Runnable的区别Executor框架使用Runnable作为其基本的任务表示形式。Runnable是一种局限性很大的抽象,它没有返回值并且不能抛出异常@FunctionalInterfacepublic interface Runnable { /** * When an object...原创 2020-03-24 18:13:09 · 333 阅读 · 0 评论 -
2.3 线程的并发工具类-Semaphore(信号量)、Exchanger
一、Semaphore1、作用控制访问某一特定资源的线程数量,例如数据库连接、mq连接等等2、举例说明1)下面举个例子,让两个线程交替打印ABABABABABAB,不能同时打印AA或者BBpackage cn.enjoy.controller.thread.DBPollSemaphore;import java.util.concurrent.Semaphore;/** * @...原创 2020-03-23 21:04:28 · 199 阅读 · 0 评论 -
2.2线程的并发工具类-CountDownLatch、CyclicBarrier
一、CountDownLatch1、作用一组线程等待其他线程完成工作之后再执行,比较像加强版的join下面演示下用法,5个线程6个扣除点,等待5个线程工作完成后,业务线程才进行自己的逻辑处理。package cn.enjoy.controller.thread.CountDownLatch;import cn.enjoy.controller.thread.DBPOLL.SleepTo...原创 2020-03-22 19:43:22 · 165 阅读 · 0 评论 -
2.1 线程的并发工具类-fork/join
一、fork/join框架的理念1、分而治之规模为N的问题,当N<阈值的时候,可以直接处理解决。当N>阈值,将N分解为K个小规模子问题。子问题需互相独立,要与原问题形式相同,递归的解决子问题,合并子问题的解,得到原问题的解。1、工作密取线程做完当前任务后,需要去获取剩余子问题来解决,提高解决问题的效率。取任务时是在任务队列中的尾部取,防止线程之间的竞争。二、fork/join...原创 2020-03-21 20:43:54 · 277 阅读 · 0 评论 -
1.3 线程间共享于协作-等待通知机制、等待超时机制实现数据库连接池。wait、notify、notifyAll,join
一、等待与通知机制、等待超时机制前言本文主要是讲述等待与通知机制和等待与超时机制,三者都是利用wait(),notify(),notifyAll()的使用来实现的。java中的这三个并发属性是属于对象的。所以各个线程在操作时候需要对对象的实例方法进行加锁,进而获得执行权。所以说是线程来对外方对象来进行加锁,进而改变条件,通知其他等待在该对象上的线程。举例实现等待与通知机制-数据库连接池1.等...原创 2020-03-15 17:51:23 · 311 阅读 · 0 评论 -
1.2 java线程间的共享与协作
java线程中断机制一、java线程的工作方式java线程之间的工作方式是协作式的,需要自己手动去结束线程,获取中断标志位,进而进行处理,或者判断当前中断标志位是否是true,false就继续执行自己的业务代码,不是就直接跳出结束线程。二、线程中断的方式1、在主线程中调用threadObject.interrupt()方法。2、在子线程中调用isinterrupt()来判断当前线程是否被...原创 2020-03-01 23:48:24 · 154 阅读 · 0 评论