随笔分类 -  Java并发多线程

摘要:【参考文章】 https://www.jianshu.com/p/df0d7d6571de http://ifeve.com/introduce-abstractqueuedsynchronizer/ 【 AbstractQueuedSynchronizer概述 】 AbstractQueuedSy 阅读全文
posted @ 2018-08-01 17:37 HigginCui 阅读(271) 评论(0) 推荐(0)
摘要:【Future使用场景】 Future表示一个可能未完成的一部任务的结果,针对这个结果可以添加CallBack,以便在任务执行成功或失败后作出相应的操作。 Future模式非常适合在处理耗时很长的业务逻辑时进行使用,可以有效旳减小系统的响应时间和提高系统的吞吐量。 【Future的类图结构】 【各个 阅读全文
posted @ 2018-07-31 23:50 HigginCui 阅读(150) 评论(0) 推荐(0)
摘要:【Future模式】 Future模式类似商品订单。比如在网购时,当看中一件商品时,就可以提交订单,当订单处理完成后,在家里等待商品送货上门即可。或者类似我们发送Ajax请求的时候,页面是异步的进行后台处理,用户无需一直等待请求的结果,可以继续浏览或操作其他内容。 【Future模式自行代码实现例子 阅读全文
posted @ 2018-07-31 23:21 HigginCui 阅读(125) 评论(0) 推荐(0)
摘要:【线程池的状态】 ThreadPoolExecutor类中定义了线程池的几种状态 当创建线程池后,初始时,线程池状态为RUNNING。 如果调用了shutdown()方法,则线程池处于SHUTDOWN状态,此时线程池不能接受新的任务,它会等待所有任务执行完毕。 如果调用了shutdownNow()方 阅读全文
posted @ 2018-04-14 15:15 HigginCui 阅读(255) 评论(0) 推荐(0)
摘要:【ThreadPoolExecutor简述】 无论是Executors类的newFixedThreadPool()、newSingleThreadExecutor(),还是newCachedThreadPool()方法,虽然看起来创建的线程有着完全不同的特点,期内部实现均使用了ThreadPoolE 阅读全文
posted @ 2018-04-14 11:59 HigginCui 阅读(251) 评论(0) 推荐(0)
摘要:【线程池简述】 线程池中,当需要使用线程时,会从线程池中获取一个空闲线程,线程完成工作时,不会直接关闭线程,而是将这个线程退回到池子,方便其它人使用。 简而言之,使用线程池后,原来创建线程变成了从线程池获得空闲线程,关闭线程变成了向池子归还线程。 【线程池带来的好处】 1.降低资源消耗,通过重复利用 阅读全文
posted @ 2018-04-01 15:41 HigginCui 阅读(4000) 评论(0) 推荐(0)
摘要:【BlockingQueue常见】 [ ArrayBlockingQueue ] 基于数组的阻塞队列的实现,在ArrayBlockingQueue内部,维护了一个定长数组,以便缓存队列中的数据对象,其内部没实现读写分离,也就意味着生产者和消费者不能完全并行,长度需要自定义,可以指定先进先出或者先进后 阅读全文
posted @ 2017-10-14 16:24 HigginCui 阅读(233) 评论(0) 推荐(0)
摘要:【简述】 ConcurrentLinkedQueue是一个适用于高并发场景下的队列,通过无锁的方式,实现了高并发状态下的高性能,通常ConcurrentLinkedQueu性能好于BlockingQueue。它是一个基于链接节点的无界线程安全队列。该队列的元素遵循先进先出的原则。头是最先加入的,尾是 阅读全文
posted @ 2017-10-14 16:12 HigginCui 阅读(235) 评论(0) 推荐(0)
摘要:【简述】 Copy-On-Write简称COW,是一种程序设计中的优化策略。 JDK里的COW容器分为两种:CopyOnWriteArrayList 和 CopyOnWriteArraySet。 CopyOnWrite容器即:写时复制的容器。通俗理解就是当我们往一个容器添加元素的时候,不直接网当前容 阅读全文
posted @ 2017-10-14 14:47 HigginCui 阅读(216) 评论(0) 推荐(0)
摘要:【简述】 ConcurrentHashMap内部使用段(Segment)来表示这些不用的部分,每个段其实就是一个小的HashTable,他们有自己的锁,只要多个修改操作发生在不同的段上,他们就可以并发执行。把一个整体的分成了16个段(Segment),也就是最高支持16个线程并发的修改操作。这也是在 阅读全文
posted @ 2017-10-14 14:25 HigginCui 阅读(422) 评论(0) 推荐(0)
摘要:【简述】 JDK1.5以后提供了多种并发类容器代替同步类容器来改善性能,同步类容器的状态都是串行化的,它们虽然实现了线程安全,但是极大地降低了并发性,在多线程环境,严重降低了应用程序的吞吐量。 并发类容器是专门针对并发设计的,如下: 1.使用ConcurrentHashMap来代替基于散列的传统Ha 阅读全文
posted @ 2017-10-10 23:17 HigginCui 阅读(234) 评论(0) 推荐(0)
摘要:【概述】 线程局部变量,是一种多线程间并发访问变量的解决方案。与synchronized等加锁的方式不同,ThreadLocal完全不提供锁,而使用以空间换时间的手段,为每个线程提供变量的独立副本,以保障线程安全。 从性能上讲,ThreadLocal不具有绝对的优势,在并发不是很高的时候,加锁的性能 阅读全文
posted @ 2017-10-10 21:52 HigginCui 阅读(174) 评论(0) 推荐(0)
摘要:【简述】 wait()和notify()方法是和synchronized关键字合作使用的。 Condition是和重入锁相关联的,通过ReentrantLock.newCondition()生成一个与当前重入锁绑定的Condition实例。 利用Condition对象,可以让线程在合适的时间等待,或 阅读全文
posted @ 2017-05-17 23:43 HigginCui 阅读(310) 评论(0) 推荐(0)
摘要:【概述】 重入锁可以完全代替synchronized关键字。 与synchronized相比,重入锁ReentrantLock有着显示的操作过程,即开发人员必须手动指定何时加锁,何时释放锁,所以重入锁对于逻辑控制的灵活性好于synchronized。 要注意的是,每次在退出临界区时,必须记得释放锁, 阅读全文
posted @ 2017-05-16 00:13 HigginCui 阅读(316) 评论(0) 推荐(0)
摘要:【线程间通信概念】 线程是操作系统中独立的个体,但这些个体如果不经过特殊的处理就不能成为一个整体,线程间的通信就成为整体必用方式之一。当线程存在通信指挥,线程间的交互性会更强大,在提高CPU利用率的同时还会使开发人员对线程任务的处理过程中进行有效的把控和监督。 【使用wait和notify的注意点】 阅读全文
posted @ 2017-04-18 00:05 HigginCui 阅读(921) 评论(0) 推荐(0)
摘要:【volatile概念】 volatile关键字的主要作用是是变量在多个线程间可见。 【注意】 在java中,每一个线程都会有一块工作内存区,其中存放着所有线程共享的主内存中的变量的拷贝。当线程执行时,他在自己的工作内存区中操作这些变量。为了存取一个共享的变量,一个线程通常会先获取并去清除它的内存工 阅读全文
posted @ 2017-04-12 00:04 HigginCui 阅读(334) 评论(0) 推荐(0)
摘要:【脏读】 对于对象同步和异步的方法,我们在设计程序的时候,一定要考虑问题的整体,不然会出现不一致的错误,最经典的错误的就是脏读(dirty read)。 【实例代码】 【运行结果:不加synchronized】 【运行结果:加上synchronized】 【关于synchronized代码块】 直接 阅读全文
posted @ 2017-04-10 22:33 HigginCui 阅读(406) 评论(0) 推荐(0)
摘要:【线程安全概念】 当多个线程访问某一个类(或对象、方法)时,这个类始终都能表现出正确的行为,那么这个类就是线程安全的。 【synchronized】 可以在任意对象及方法上加锁,而加锁的这段代码被称为“互斥区”或“临界区”。 【不加synchronized和加synchronized的不同情况】 【 阅读全文
posted @ 2017-04-06 00:01 HigginCui 阅读(245) 评论(0) 推荐(0)
摘要:【死锁例子】 【运行结果】 【分析】 创建两个线程"筷子线程"和"刀叉线程",flag值分别为true和false,分别执行run方法中的if和else的代码块,注意chopstick和knifefork对象锁都是静态变量,所以两个线程中的static变量时一致的。当筷子线程拥有chopsticks 阅读全文
posted @ 2016-12-06 10:49 HigginCui 阅读(332) 评论(0) 推荐(0)
摘要:【线程安全问题例子】 模拟售票案例,4个窗口售票,总共100张票。 【运行结果】 【分析】 当只剩下一张票时,某个线程判断满足while(tickets>0)进入循环,然后休眠10ms,此时其它线程在这10ms内依次进入判断while(tickets>0),然后都休眠10ms,最后大家都执行最后的S 阅读全文
posted @ 2016-12-06 09:30 HigginCui 阅读(426) 评论(0) 推荐(0)