前面两篇讲解了线程池中线程创建后的运行情况,其中有一系列的策略来保证线程正常运行.但是我们知道线程池是可以设置容量的,而且这容量的设置也是至关重要的,如果容量设置的太小,那么将会影响系统的运行效率,如果设置的过大,也可能造成无止尽的线程堆积,最终造成系统内存溢出.对于此,线程池也提供了一些设置来防止这些现象.下面我们将会介绍. 线程初始化 当我们创建线程池后,如果没有新任务进来的话,默认是没有线程的,提交任务后线程池才会创建新的线程.如果你想创建线程池时就初始化corePoolSize数量的线程…
上一篇从整体上介绍了Executor接口,从上一篇我们知道了Executor框架的最顶层实现是ThreadPoolExecutor类,Executors工厂类中提供的newScheduledThreadPool.newFixedThreadPool.newCachedThreadPool方法其实也只是ThreadPoolExecutor的构造函数参数不同而已.通过传入不同的参数,就可以构造出适用于不同应用场景下的线程池,那么它的底层原理是怎样实现的呢,这篇就来介绍下ThreadPoolExecu…
一.概述 Java是天生就支持并发的语言,支持并发意味着多线程,线程的频繁创建在高并发及大数据量是非常消耗资源的,因为java提供了线程池.在jdk1.5以前的版本中,线程池的使用是及其简陋的,但是在JDK1.5后,有了很大的改善.JDK1.5之后加入了java.util.concurrent包,java.util.concurrent包的加入给予开发人员开发并发程序以及解决并发问题很大的帮助.这篇文章主要介绍下并发包下的Executor接口,Executor接口虽然作为一个非常旧的接口(JDK…
http://www.iteye.com/topic/1118484 因为有 netty.mima等远程框架.包括spring jboss等remoting框架 和阿里的dubbo相比, 没有亮点... dubbo都要出2.0.9了. 监控系统界面都出来了..重要是dubbo是SOA的思想, 而且提供了很多自治的一些功能. 还在阿里内部大范围使用(久经考验, 最近的阿里社区网站也是用dubbo做的)(http://code.alibabatech.com/wiki/display/dubbo/H…
Hibernate作为和数据库数据打交道的框架,自然会设计到操作数据的效率问题,而对于一些频繁操作的数据,缓存策略就是提高其性能一种重要手段,而Hibernate框架是支持缓存的,而且支持一级和二级两种缓存,合理的使用缓存策略可以大大提高我们的操作数据效率,但是利用不能,可能会造成不必要的麻烦. 一,一级缓存(Session缓存): Session缓存表示将查询结果放置到Session的临时存储空间(一级缓存中).Hibernate框架默认支持一级缓存的.一级缓存的范围较小,一旦Session关…
在CLH锁核心思想的影响下,Java并发包的基础框架AQS以CLH锁作为基础而设计,其中主要是考虑到CLH锁更容易实现取消与超时功能.比起原来的CLH锁已经做了很大的改造,主要从两方面进行了改造:节点的结构与节点等待机制.在结构上引入了头结点和尾节点,他们分别指向队列的头和尾,尝试获取锁.入队列.释放锁等实现都与头尾节点相关,并且每个节点都引入前驱节点和后后续节点的引用:在等待机制上由原来的自旋改成阻塞唤醒.如图2-5-9-4,通过前驱后续节点的引用一节节连接起来形成一个链表队列,对于头尾节点的…
github代码地址: https://github.com/showkawa/springBoot_2017/tree/master/spb-demo/spb-brian-query-service 假设一个需求用户点击某个页面,我们后台需要向MQ推送信信息 1,模拟的MQ服务,我这边使用RabbitMQ (关于MQ 发送和监听消息可以参考我的博客:SpringBoot消息中间件RabbitMQ) //后台监听消息 @RabbitListener(queues = "brian.test&qu…
我们知道一个线程在尝试获取锁失败后将被堵塞并增加等待队列中,它是一个如何的队列?又是如何管理此队列?这节聊聊CHL Node FIFO队列.  在谈到CHL Node FIFO队列之前,我们先分析这样的队列的几个要素. 首先要了解的是自旋锁.所谓自旋锁即是某一线程去尝试获取某个锁时.假设该锁已经被其它线程占用的话.此线程将不断循环检查该锁是否被释放,而不是让此线程挂起或睡眠.它属于为了保证共享资源而提出的一种锁机制,与相互排斥锁类似,保证了公共资源在随意时刻最多仅仅能由一条线程获取使用.不同的是…
看Craig, Landin, and Hagersten发明的CLH锁如何优化同步带来的花销,其核心思想是:通过一定手段将所有线程对某一共享变量轮询竞争转化为一个线程队列且队列中的线程各自轮询自己的本地变量.这个转化过程由两个要点,一是构建怎样的队列&如何构建队列,为了保证公平性,构建的将是一个FIFO队列,构建的时候主要通过移动尾部节点tail实现队列的排队,每个想获取锁的线程创建一个新节点并通过CAS原子操作将新节点赋予tail,然后让当前线程轮询前一节点的某个状态位,如图2-5-9-3,…
我们知道一个线程在尝试获取锁失败后将被阻塞并加入等待队列中,它是一个怎样的队列?又是如何管理此队列?这节聊聊CHL Node FIFO队列. 在谈到CHL Node FIFO队列之前,我们先分析这种队列的几个要素.首先要了解的是自旋锁,所谓自旋锁即是某一线程去尝试获取某个锁时,如果该锁已经被其他线程占用的话,此线程将不断循环检查该锁是否被释放,而不是让此线程挂起或睡眠.它属于为了保证共享资源而提出的一种锁机制,与互斥锁类似,保证了公共资源在任意时刻最多只能由一条线程获取使用,不同的是互斥锁在获取…
Executor存在的目的是提供一种将"任务提交"与"任务如何运行"分离开来的机制.虽然只有一个方法,但是却为灵活且强大的异步任务执行框架提供了基础.它提供了一种标准的方法将任务的提交过程与执行过程解耦开来,并用Runnable来表示任务. 一.线程池 对于数据库连接,我们经常听到数据库连接池这个概念.因为建立数据库连接时非常耗时的一个操作,其中涉及到网络IO的一些操作.因此就想出把连接通过一个连接池来管理.需要连接的话,就从连接池里取一个.当使用完了,就“关闭”连…
问题分析 问题一:要求日志最好入库:但是,直接入库mysql确实扛不住,批量入库没有问题,done.[批量入库和直接入库性能差异] 问题二:批量入库就需要有高并发的消息队列,决定采用redis list 仿真实现,而且方便回滚. 问题三:日志量毕竟大,保存最近30条足矣,决定用php写个离线统计和清理脚本. 一.设计数据库表和存储 考虑到log系统对数据库的性能更多一些,稳定性和安全性没有那么高,存储引擎自然是只支持select insert 没有索引的archive.如果确实有update需求…
转载请注明原创出处,谢谢! 首先需要说说线程安全?关于线程安全一直在提,比如StringBuilder和StringBuffer有什么区别? 经常就会出现关于线程安全与线程非安全,可能一直在提自己没有细细想想,如果忽然问你啥是线程安全的概念?可能你需要短暂停顿几秒,线程不安全就是不提供数据访问保护,有可能出现多个线程先后更改数据造成所得到的数据是脏数据,其实关于线程安全的定义我想不到好的,百度了下,也没有发现一个特别好的解释,我就选择一个相对来说还可以的解释吧 ,线程安全就是多线程访问时,采用了…
欲看此文,必先可先看: golang实现并发爬虫一(单任务版本爬虫功能) gollang实现并发爬虫二(简单调度器) 上文中的用简单的调度器实现了并发爬虫. 并且,也提到了这种并发爬虫的实现可以提高爬取效率. 当workerCount为1和workerCount为10时其爬取效率是有明显不同的. 然而,文末其实也提到了这个简单调度器实现的爬虫有个不可控或者说是控制力太小了的问题. 究其原因就是因为我们实现的方法是来一个request就给创建一个groutine. 为了让这个程序变得更为可控.得想…
概述 基本流有字节输入输出流(InputStream,OutputStream),和字符输入输出流(Reader,Writer),它们都是抽象类,作为Java IO API中其他所有流的父类存在. 我们知道数据存储在介质中时是以二进制的形式存在,用字节(byte)形式就可以实现读写,在jdk1.0版本中也只有字节输入输出流(InpuStream,OutputStream),在之后的1.1版本才加入了字符输入输出流(Reader,Writer),这是为了满足一些文本读写方便,比如中文字符可能占有两…
演示一个阻塞队列的使用 public class BlockingQueueTest { public static void main(String[] args) { //创建一个包含三个元素的阻塞队列 final BlockingQueue<Integer> queue = new ArrayBlockingQueue<Integer>(3); for (int i = 0; i < 2; i++) { new Thread(new Runnable() { @Over…
1.二级缓存: 需要导入二级缓存jar包: mybatis03: ehcache.xml: <ehcache xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:noNamespaceSchemaLocation="../config/ehcache.xsd"> <diskStore path="java.io.tmpdir"/> <!-- Mandat…
pom.xml引入依赖包 <!--jedis.jar --> <dependency> <groupId>redis.clients</groupId> <artifactId>jedis</artifactId> <version>2.9.0</version> </dependency> <!-- Spring下使用Redis --> <dependency> <g…
对于前端工程师来说,浏览器缓存优化是个永远的话题.前几天看了知乎上的一个问答:<大公司里怎样开发和部署前端代码?>,深以为然,所以决心使用 FIS 来优化自身的前端文件. 我们的项目使用了 go 语言的 revel 做 web 框架.这个框架的目录结构混合了前后端的文件,没法做到前后端开发的完全分离.所以我们要做的第一步,就是分离前后端的文件. 分离前后端 因为已经决定使用 FIS 来优化前端,所以特别利用了 FIS 的编译文件这个功能.既然没法做到完全的前后端分离,至少也要分离一部分吧. 首…
Java 1.5前 并发实现 Java Green Thread java 1.2 前的线程受os内核限制, 线程=进程, 绿色线程是JVM调度, 用来模拟多线程环境. 不需要本地线程支持. Java Native Thread 对比 绿色线程在线程激活和线程同步方面优于本地线程 在I/O和上下文操作方面性能要低于本地线程 编程模型 Thread Runnable 局限性(后续版本将解决完善这部分缺陷, 可对比学习) 缺少线程管理的原生支持(缺少线程池) 缺少"锁"API(只有 syn…
这是java高并发系列第19篇文章. 本文主要内容 介绍Executor框架相关内容 介绍Executor 介绍ExecutorService 介绍线程池ThreadPoolExecutor及案例 介绍定时器ScheduledExecutorService及案例 介绍Excecutors类的使用 介绍Future接口 介绍Callable接口 介绍FutureTask的使用 获取异步任务的执行结果的几种方法 Executors框架介绍 Executors框架是Doug Lea的神作,通过这个框架…
JUC包中除了一系列的同步类之外,就是Executor运行框架相关的类.对于一个运行框架来说,能够分为两部分 1. 任务的提交 2. 任务的运行. 这是一个生产者消费者模式,提交任务的操作是生产者,运行任务的线程相当于消费者. Executor接口设计的目的是专注于任务的运行.和任务的提交解耦. 任务的提交由任务的创建者处理. Executor接口封装了任务运行的细节,比方怎样使用线程,是否定时运行等等. Executor接口非常easy,就一个execute方法. public interfa…
主要是自己在项目中(中小型项目) 有支付下单业务(只是办理VIP,没有涉及到商品库存),目前用户量还没有上来,目前没有出现问题,但是想到如果用户量变大,下单并发量变大,可能会出现一系列的问题,趁着空闲时间,做了这个demo测试相关问题. 可能遇到的问题如下: 1.订单重复 2.高并发下,性能变慢 解决方式:ThreadPoolExecutor线程池 + Queue队列 开发工具:IDEA 15 1.首先是springBoot的项目框架如下 2.业务测试流程涉及的类,如下 BusinessThre…
在上一篇聊聊高并发(三十三)从一致性(Consistency)的角度理解Java内存模型 我们说了Java内存模型是一个语言级别的内存模型抽象.它屏蔽了底层硬件实现内存一致性需求的差异,提供了对上层的统一的接口来提供保证内存一致性的编程能力. 在一致性这个问题域中,各个层面扮演的角色大致例如以下: 1. 一致性模型,定义了各种一致性模型的理论基础 2. 硬件层,提供了实现某些一致性模型的硬件能力.硬件在默认情况下依照最主要的方式执行,比方 对同一个线程没有数据依赖的指令能够重排序优化运行,有数据…
这是java高并发系列第20篇文章. 本文内容 ExecutorCompletionService出现的背景 介绍CompletionService接口及常用的方法 介绍ExecutorCompletionService类及其原理 示例:执行一批任务,然后消费执行结果 示例[2种方式]:异步执行一批任务,有一个完成立即返回,其他取消 需要解决的问题 还是举个例子说明更好理解一些. 买新房了,然后在网上下单买冰箱.洗衣机,电器商家不同,所以送货耗时不一样,然后等他们送货,快递只愿送到楼下,然后我们…
一.前言 优秀的源码就在那里 经过了前面两章的铺垫,终于要切入正题了,本章也是整个AQS的核心之一 从本章开始,我们要精读AQS源码,在欣赏它的同时也要学会质疑它.当然本文不会带着大家逐行过源码(会有"只在此山中,云深不知处"的弊端),而是从功能入手,对其架构进行逐层剖析,在核心位置重点解读,并提出质疑:虽然AQS源码读起来比较"跳",但我还是建议大家花时间及精力去好好读它 本章我们采用经典并发类ReentrantLock来阐述独占锁 二.整体回顾 独占锁,顾名思义…
Java_并发编程培训 java并发程序设计教程 JUC Exchanger 一.概述 Exchanger 可以在对中对元素进行配对和交换的线程的同步点.每个线程将条目上的某个方法呈现给 exchange 方法,与伙伴线程进行匹配,并且在返回时接收其伙伴的对象.Exchanger 可能被视为 SynchronousQueue的双向形式.Exchanger 可能在应用程序(比如遗传算法和管道设计)中很有用. 二.算法描述 基本想法是维护一个槽指向一个结点,结点包含一个准备提供(出去)的item和一…
Java中的线程池是运用场景最多的并发框架,几乎所有需要异步或并发执行任务的程序都可以使用线程池.在开发过程中,合理地使用线程池能够带来3个好处. 1. 降低资源消耗.通过重复利用已创建的线程降低线程创建和销毁造成的消耗: 2. 提高响应速度.当任务到达时,任务可以不需要等到线程创建就能立即执行: 3. 提高线程的可管理性.线程是稀缺资源,如果无限制地创建,不仅会消耗系统资源,还会降低系统的稳定性,使用线程池可以进行统一分配.调优和监控.但是,要做到合理利用线程池,必须对其实现原理了如指掌. 线…
1. Fork/Join框架 2. Executor框架 3. ThreadPoolExecutor 4. ScheduledThreadPoolExecutor 5. FutureTask 6. txt java并发框架 Fork/Join框架 定义 一个用于并行执行任务的框架,是一个把大任务分割成若干个小任务,最终汇总每个小任务结果后得到大任务结果的框架 核心思想 分治 fork分解任务,join收集任务 工作窃取算法 定义 工作窃取算法work-stealing: 某个线程从其他队列里窃取…
Executor框架是指java 5中引入的一系列并发库中与executor相关的一些功能类,其中包括ThreadPool,Executor,Executors,ExecutorService,CompletionService,Future,Callable等. 并发编程的一种编程方式是把任务拆分为一系列的小任务,即Runnable,然后在提交给一个Executor执行,Executor.execute(Runnalbe) .Executor在执行时使用内部的线程池完成操作.一.创建线程池Ex…