互联网进行限流策略的Semaphore信号量使用
摘要:在Semaphore信号量非常适合高并发访问,新系统在上线之前,要对系统的访问量进行评估,当然这个值肯定不是随便拍拍脑袋就能想出来的,是经过以往的经验、数据、历年的访问量,已经推广力度进行一个合理的评估,当然评估标准不能太大也不能太小,太大的话投入的资源达不到实际效果,纯粹浪费资源,太小的话,某个时
阅读全文
posted @
2017-02-28 14:11
小~虎
阅读(456)
推荐(0)
并发编程中Future和Callable使用
摘要:Future模式非常适合在处理很耗时很长的业务逻辑时进行使用,可以有效的减少系统的响应时间,提高系统的吞吐量。 看一个小的demo: 看一下执行结果: 这是异步去获取结果的示例,在子线程去处理任务的时候,主线程可以进行自己的逻辑处理。 这个类要实现Callable接口,实现call()方法。 如果主
阅读全文
posted @
2017-02-27 17:16
小~虎
阅读(185)
推荐(0)
CountDownLatch的和CyclicBarrier使用
摘要:CyclicBarrier的使用: 假设只有一个场景:每个线程代表一个跑步运动员,当运动员都准备好后,才一起出发,只要有一个人没有准备好,大家都等待。 CountDownLacth使用: 他经常用于监听某些初始化操作,等初始化执行完毕后,通知主线程继续工作。 下面先看一个CountDownLatch
阅读全文
posted @
2017-02-27 16:02
小~虎
阅读(167)
推荐(0)
自定义线程池使用详细
摘要:这个构造方法对于队列是什么类型的比较关键 在使用有界队列时,若有新的任务需要执行,如果线程池实际线程数小于corePoolSize,则优先创建线程,若大于corePoolSize,则会将任务加入队列,若队里已满,则在总线程数不大于maximumPoolSize的前提下,创建新的线程,若线程数大于ma
阅读全文
posted @
2017-02-24 11:34
小~虎
阅读(551)
推荐(0)
Executor框架
摘要:为了更好的控制多线程,JDK提供了一套线程框架Executor,帮助开发人员有效地进行线程控制。他们都在java.util.concurrent包中,是JDK并发包的核心。其中有一个比较重要的类:Executors,他扮演着线程工厂的角色,我们通过Executors可以创建特定功能的线程池。 Exe
阅读全文
posted @
2017-02-23 13:35
小~虎
阅读(126)
推荐(0)
生产者-消费者模式
摘要:生产者和消费者也是一个非常经典的多线程模式,我们在实际开发中应用非常广泛的思想理念。在生产-消费模式中:通常由两类线程,即若干个生产者的线程和若干个消费者的线程。生产者线程负责提交用户请求,消费者线程则负责具体处理生产者提交的任务,在生产者和消费者之间通过共享内存缓存区进行通信。 下面看一个demo
阅读全文
posted @
2017-02-22 19:23
小~虎
阅读(169)
推荐(0)
Master-Worker模式
摘要:Master-Worker模式是常用的并行计算模式。它的核心思想是系统由两类进程协作工作:Master进程和woker进程。Master负责接收和分配任务,Worker负责处理子任务。当各个Worker子进程处理完成后,会将结果返回给Master,由Master做归纳和总结。其好处是能够将一个大任务
阅读全文
posted @
2017-02-20 10:53
小~虎
阅读(174)
推荐(0)
Future模式
摘要:Future 模式有点类似于商品订单。比如在网购物时,当看重某一件商品时,就可以提交订单,当订单处理完成后,在家里等待商品送货上门即可。或者说更形象的我们发送Ajax请求的时候,页面是异步的进行后台处理,用户无须一直等待请求的结果,可以继续浏览活操作其他内容。 下面同样看一段demo,这段demo的
阅读全文
posted @
2017-02-18 15:33
小~虎
阅读(128)
推荐(0)
了解Queue
摘要:在并发队列上JDK提供了两套实现,一个是以ConcurrentLinkedQueue为代表的高性能队列,一个是以BlockingQueue接口为代表的阻塞队列,无论哪种都继承自Queue, 可以对应着下面的图看一下: 先介绍一下ConcurrentLinkedQueue: ConcurrentLin
阅读全文
posted @
2017-02-17 15:00
小~虎
阅读(239)
推荐(0)
ConcurrentMap与CopyOnWrite容器
摘要:ConcurrentMap接口下有两个重要的实现: ConcurrentHashMap ConcurrentSkipListMap(支持并发排序功能,弥补ConcurrentHashMap) ConcurrentHashMap内部使用段(Segment)来表示这些不同的部分,每个段其实就是一个小的H
阅读全文
posted @
2017-02-16 10:40
小~虎
阅读(546)
推荐(0)
同步类容器和并发类容器概念
摘要:同步类容器: 同步类容器都是线程安全的, 但在某些场景下可能需要加锁来保护复合操作。符合类操作如:迭代(反复访问元素,遍历完容器中所有的元素)、跳转(根据指定的顺序找到当前元素的下一个元素)、以及条件运算。这些复合操作在多线程并发地修改容器时,可能会表现出意外的行为,最经典的便是Concurrent
阅读全文
posted @
2017-02-15 10:06
小~虎
阅读(203)
推荐(0)
单例&多线程
摘要:单例模式,最常见的就是饥饿模式,和懒汉模式,一个直接实例化对象,一个在调用方法时进行实例化对象。在多线程模式中,考虑到性能和线程安全问题,我们一般选择下面两种比较经典的单例模式,在性能提高的同时,又保证了线程安全。 dubble check Instance 》》 static Inner clas
阅读全文
posted @
2017-02-15 09:29
小~虎
阅读(215)
推荐(0)
ThreaLocal
摘要:ThreadLocal概念:线程局部变量,是一种多线程间并发访问变量的解决方案。与其synchronized等加锁的方式不同,ThreadLocal完全不提供锁,而使用以空间换时间的手段,为每个线程提供变量的独立副本,以保障线程安全。 从性能上说,ThreadLocal不具有绝对的优势,在并发不是很
阅读全文
posted @
2017-02-14 16:46
小~虎
阅读(258)
推荐(0)
queue模拟
摘要:BlockingQueue:顾名思义,首先它是一个队列,并且支持阻塞的机制,阻塞的放入和得到数据。我们要实现LinkedBlockingQueue下面两个简单的方法put和take。 put(anObject):把anObject加到BlockingQueue里,如果blockQueue没有空间,则
阅读全文
posted @
2017-02-14 15:27
小~虎
阅读(211)
推荐(0)
多线程通信(wait和notify)
摘要:线程通信概念: 线程是操作系统中独立的个体,但这些个体如果不经过特殊的处理就不能成为一个整体,线程间的通信就成为整体的必用方式之一。当线程存在通信指挥,系统间的交互性会更强大,在提高CPU利用率的同时还会使开发人员对线程任务在处理的过程中进行有效的把控与监督。 使用wait/notify方法实现线程
阅读全文
posted @
2017-02-14 10:18
小~虎
阅读(166)
推荐(0)
volatile关键字
摘要:volatile概念:volatile关键字的主要作用是使变量在多个线程间可见。 看一段demo: 进入run方法..isRunning的值已经被设置了false线程停止false 我们看一个内存分析图: 就是上面框里面写的,被volatile修饰的变量,当变量改变时,会强制线程执行引擎去主内存里去
阅读全文
posted @
2017-02-13 14:51
小~虎
阅读(140)
推荐(0)
synchronized细节问题(二)
摘要:使用synchronized声明的方法在某些情况下是有弊端的,比如A线程调用同步的方法执行一个很长时间的任务,那么B线程就必须等待比较长的时间才能执行,这样的情况下,可以使用synchronized代码块去优化代码执行时间,也就是通常所说的减小锁的粒度。 synchronized可以使用任意的Obj
阅读全文
posted @
2017-02-10 14:56
小~虎
阅读(136)
推荐(0)
synchronized细节问题(一)
摘要:synchronized锁重入: 关键字synchronized拥有锁重入的功能,也就是在使用synchronized时,当一个线程得到一个对象的锁后,再次请求此对象时是可以再次得到该对象的锁。 下面看一段锁重入的小demo: method1..method2..method3.. 这是一个最简单的
阅读全文
posted @
2017-02-10 14:03
小~虎
阅读(255)
推荐(0)
脏读
摘要:脏读:对于对象的同步和异步的方法,我们在设计自己的程序的时候,一定要考虑问题的整体,不然就会出现数据不一致的错误,很经典的错误就是脏读(dirtyread) 我们首先通过一个小demo来认识一下脏读: setValue最终结果:username = z3 , password = 456getVal
阅读全文
posted @
2017-02-09 16:11
小~虎
阅读(228)
推荐(0)
线程基础(二)
摘要:一、多个线程多个锁 多个线程多个锁:多个线程,每个线程都可以拿到自己指定的锁,分别获得锁之后,执行synchronized方法体的内容。 代码如下: tag a , set nunm overtag a,num = 100tag b , set nunm overtag b,num = 200 实际
阅读全文
posted @
2017-02-09 11:46
小~虎
阅读(169)
推荐(0)
线程基础(一)
摘要:恢复内容开始 线程安全概念:当多个线程访问某一个类(对象或方法)时,这个类始终都能变现出正确的行为,那么这个类(对象或方法)就是线程安全的。 synchronized:可以在任意对象及方法上加锁,而加锁的这段代码称为"互斥区"或"临界区"。 下面看一段代码: t3 count = 2t5 count
阅读全文
posted @
2017-02-09 09:58
小~虎
阅读(117)
推荐(0)