多线程
文章平均质量分 92
多线程编程
jeff.sheng
一只没有梦想的咸鱼
展开
-
ExecutorService的submit()/shutdown/shutdownNow
package executorTest;import java.util.ArrayList; import java.util.List; import java.util.Random; import java.util.concurrent.Callable; import java.util.concurrent.ExecutionException;原创 2018-01-09 11:29:00 · 1233 阅读 · 0 评论 -
每天一例多线程[day11]-----ThreadLocal
package com.jeff.base.conn010;public class ConnThreadLocal { public static ThreadLocal<String> th = new ThreadLocal<String>(); public void setTh(String value){ th.set(value); } ...原创 2018-06-04 00:04:18 · 194 阅读 · 0 评论 -
每天一例多线程[day12]-----单例模式与线程安全
1懒汉模式-非安全懒汉模式(线程不安全,可能出现多个Singleton 实例)public class Singleton { private static Singleton instance; private Singleton (){} public static Singleton getInstance() { if (insta...原创 2018-06-04 00:07:23 · 243 阅读 · 0 评论 -
每天一例多线程[day13]-----JDK从同步类容器到并发类容器
对Vector、ArrayList在迭代的时候如果同时对其进行修改就会抛出java.util.ConcurrentModificationException如:package com.jeff.base.coll012;import java.util.Iterator;import java.util.Vector;/** * 多线程使用Vector或者HashTabl...原创 2018-06-04 23:30:53 · 346 阅读 · 0 评论 -
每天一例多线程[day14]----JDK并发包Queue队列
队列简介 关于什么时候使用MQ消息队列,什么时候使用JAVA自带队列,有一些基本的原则,如下图:生产者:生产消息的速度很慢,缓慢地放入MQ中存储。 消费者:消费能力强,快速处理掉MQ中的消息。这种场景下,MQ就不适合使用了,因为消费端的处理能力很强,生产者完全可以通过TCP长连接直连消费者,比如使用Netty或者Mina等框架就比较合适。介绍几种JDK并发包下的队...原创 2018-06-06 00:14:10 · 427 阅读 · 0 评论 -
每天一例多线程[day22]-----Disruptor并发框架简介HelloWorld
Disruptor是一个开源的并发框架,并获得2011年Duke's程序框架创新奖,能够在无锁的情况下实现网络的Queue队列并发操作。Disruptor是一个高性能的异步处理框架,或者可以认为是最快的消息框架(轻量的JMS),也可以认为是一个观察者模式的实现,或者事件监听模式的实现。也可以理解为一个高效的“生产者-消费者”模型。性能远远高于传统的BlockingQueue。Disruptor的R...原创 2018-06-13 01:23:35 · 955 阅读 · 0 评论 -
每天一例多线程[day23]-----Disruptor的两种简单实现
在Disruptor中,Ringbuffer存放的数据可以被称作“trade”,即交易或者订单。在之前HelloWorld的例子中,我们获取disruptor实例,然后调用getRingbuffer()来获取RingBuffer,其实在很多时候,我们可以直接使用RingBuffer,以及其他的API操作。...原创 2018-06-14 00:55:47 · 2111 阅读 · 2 评论 -
每天一例多线程[day16]-----Master-Worker模式
Master-Worker模式:常用于并行计算。核心思想:系统由两类进行协作工作,Master进程和Worker进程。Master负责接收和分配任务,Worker负责处理子任务。当各个worker子进程处理完成后,会将结果返回给master,由master做归纳和总结。其好处时能将一个大任务,分解为若干个小任务,并行执行,从而提高系统吞吐量。举个例子:由于施工需要,工地上源源不断有水泥运过来。工头...原创 2018-06-08 00:57:54 · 336 阅读 · 0 评论 -
每天一例多线程[day24]-----Disruptor之单一生产者多消费者
在复杂场景下,希望一个生产者生产的数据放入RingBuffer后,能够被多个消费者消费,至于消费的方式,可能各有不同,比如菱形结构、六边形结构、顺序执行。接下来我们一一介绍菱形结构:说明:P1生产的数据给C1和C2并行执行完成后,再交给C3执行。代码:Handler1:设置了事先名称h1import com.lmax.disruptor.EventHandler;import com.lmax....原创 2018-06-15 23:53:53 · 2760 阅读 · 0 评论 -
每天一例多线程[day25]-----Disruptor之多生产者多消费者
模拟一个多生产者(比如100个)生产订单(每个生产者生产100个订单),3个消费者消费订单的场景Order:public class Order { private String id;//ID private String name; private double price;//金额 public String getId() { return id; } ...原创 2018-06-16 00:31:11 · 2641 阅读 · 1 评论 -
每天一例多线程[day17]-----Executors框架
为了更好的控制多线程,JDK提供了一套线程框架Executor,帮助开发人员有效进行线程控制。他们都在java.util.concurrent包中,是JDK并发包的核心。其中有一个比较重要的类Executors,扮演了线程工厂的角色,通过它可以创建特定功能的线程池。Executors创建线程池的方法:/** * 以下四种底层实现核心都是实例化了一个ThreadPoolExecutor对象返回...原创 2018-06-10 16:22:15 · 390 阅读 · 0 评论 -
每天一例多线程[day18]-----ThreadPoolExecutor
/* 自定义线程池。 * 构造参数: * public ThreadPoolExecutor( * int corePoolSize,--当前线程池核心线程数 * int maximumPoolSize,--当前线程池最大线程数 * long keepAliveTime,--保持活着的空间时间 * TimeUnit u...原创 2018-06-10 17:16:05 · 295 阅读 · 0 评论 -
每天一例多线程[day20]-----ReentrantLock
ReentrantLock是JDK的并发包下locks包下的工具类,ReentrantLock比synchonized性能要好,但是jdk1.8之后synchonized的性能也得到大幅度提升,不亚于ReentrantLock。锁的演变 ReentrantLock是由synchonized和对象锁演变而来。回忆以下之前使用synchronized和Object锁的方式:public void me...原创 2018-06-11 00:31:08 · 277 阅读 · 0 评论 -
每天一例多线程[day21]-----ReentrantReadWriteLock
ReentrantReadWriteLock,读写锁,核心就是实现读写分离的锁,在高并发访问下,尤其是读多写少的场景下,性能要远远高于重入锁。之前的ReentrantLock和Synchronized在同一时间内只能有一个线程访问被锁定的代码,那么读写锁则不同,其本质时分成两个锁,读锁+写锁,在读锁下,多个线程可以并发地访问;但是在写锁的时候只能一个一个顺序访问。总结:读读共享,读写互斥,写写互斥...原创 2018-06-11 00:47:28 · 351 阅读 · 0 评论 -
每天一例多线程[day9]-----多线程间的通信
以下例子中ListAdd类都有一个被volitile修饰的 private volatile static List list = new ArrayList();用于向集合中添加元素。volatile实现package com.jeff.base.conn008;import java.util.Ar...原创 2018-06-03 23:11:13 · 253 阅读 · 0 评论 -
Java多线程的调度策略
在Java多线程环境中,为保证所有线程的执行能按照一定的规则执行,JVM实现了一个线程调度器,它定义了线程调度的策略,对于CPU运算的分配都进行了规定,按照这些特定的机制为多个线程分配CPU的使用权。这小节关注线程如何进行调度,了解了java线程调度模式有助于后面并发框架的深入探讨。一般线程调度模式分为两种——抢占式调度和协同式调度。抢占式调度指的是每条线程执行的时间、线程的切换都由系统控制,系统...转载 2018-02-08 12:21:58 · 966 阅读 · 0 评论 -
线程Thread的状态流转
线程状态介绍线程的5种状态:新建(New)、就绪(Runnable)、运行(Running)、阻塞(Blocked)和死亡(Dead)5种状态。1. 新建状态,当程序使用new关键字创建了一个线程之后,该线程就处于新建New状态,此时仅由JVM为其分配内存,并初始化其成员变量的值2. 就绪状态,当线程对象调用了start()方法之后,该线程处于就绪Runnable状态。Java虚拟机会为其创建方法...原创 2018-02-08 12:41:06 · 668 阅读 · 0 评论 -
每天一例多线程[day7]-----volatile关键词的含义
先出一道题:package com.day20180208; public class MyThread extends Thread { private int count = 1; private void setCount(int count) { this.count = count; } ...转载 2018-02-08 17:00:05 · 352 阅读 · 1 评论 -
JAVA并发包-同步工具(3)---CountDownLatch解读小例
需求:写一段程序,要求在考试完成以后对考试成绩做出统计。package com.day20180312;import java.util.concurrent.CountDownLatch;public class TestCountDownLatch { public static void main(String[] args) { TestCountDownLatch....原创 2018-03-12 15:09:52 · 345 阅读 · 0 评论 -
JAVA并发包-同步工具(3)---CyclicBarrier解读小例
CyclicBarrier内部维护了一个递减的计数器count,还有一个记录初始值的parties,在线程任务执行中通过调用CyclicBarrier#await()方法,计数器count减去1,如果count递减之后仍然大于0,线程将阻塞。直到最后一个线程调用了CyclicBarrier#await()方法,count刚好递减为0,满足了期望条件,CyclicBarrier的构造器任务将会执行。通过这个原理描述可以看出,CyclicBarrier就好像一道屏障,当小兔子们撞击的次数达到了阈值,屏障将会被冲原创 2018-03-26 15:01:12 · 306 阅读 · 0 评论 -
JAVA并发包-同步工具(3)---Semaphore信号量
Semaphore可以控制系统流量,拿到信号量的可以进入,否则就等待,通过acquire和release方法获取和释放访问许可。举例:package com.day20180312;import java.util.Random;import java.util.concurrent.ExecutorService;import java.util.concurrent.Exec...原创 2018-06-02 21:07:23 · 238 阅读 · 0 评论 -
每天一例多线程[day1]-----synchronized与锁竞争
/** * 多个线程一把锁 * * 线程安全概念: * 当多个线程访问某一个类(对象或方法)时,这个对象始终都能表现出正确的行为, * 那么这个类(对象或方法)就是线程安全的。 * * synchronized:可以在任意对象及方法上加锁,而加锁的这段代码称为"互斥区"或"临界区" * * * 描述:观察MyThread类的run方法上加锁synchroni...原创 2018-06-03 15:04:52 · 767 阅读 · 0 评论 -
每天一例多线程[day2]-----synchronized与多个线程多个锁
package com.jeff.base.sync002;/** * 多个线程多个锁 * * 关键字synchronized取得的锁都是对象锁,而不是把一段代码(方法)当做锁, * 所以代码中哪个线程先执行synchronized关键字的方法,哪个线程就持有该方法所属对象的锁(Lock), * * @author jeff * */public class MultiTh...原创 2018-06-03 15:13:00 · 413 阅读 · 0 评论 -
每天一例多线程[day3]-----synchronized与一个对象多个方法一把锁
package com.jeff.base.sync003;/** * 一个对象多个方法一把锁 * * 对象锁的同步和异步问题 * @author jeff * */public class MyObject { /** * 同步方法 */ public synchronized void method1(){ try { System.out.pr...原创 2018-06-03 15:21:17 · 898 阅读 · 1 评论 -
每天一例多线程[day4]-----使用synchronized避免DirtyRead
问题:以oracle数据库为例,比如当我们在下午2点钟查询用户表的一条记录值100,由于网络卡顿,数据库直到2点半才查询出来这条记录,在这半小时内,其他用户将用户表的这条记录修改为200了,那么请问2点半我们看到的这条数据是100还是200? 答案是100,原因是oracle数据库存在一致性读的特性,不管修改的次数再多,即使抛出异常也不会看到200这个数据。在多线程应用中,当我们在...原创 2018-06-03 15:54:06 · 354 阅读 · 0 评论 -
每天一例多线程[day5]-----synchronized锁重入
package com.jeff.base.sync005;/** * synchronized的重入: * 当一个线程得到一个对象锁且还未释放锁时,再次请求此对象锁时可以再次得到该对象的锁 * @author alienware * */public class SyncDubbo1 { public synchronized void method1(){ Syst...原创 2018-06-03 17:19:02 · 268 阅读 · 0 评论 -
每天一例多线程[day6]-----synchronized锁的粒度控制
syhchronized写法举例package com.jeff.base.sync006;/** * 使用synchronized声明的方法在某些情况下是有弊端的, * 比如:A线程调用synchronized同步的方法执行一个很长时间的任务,那么B线程就必须等待比较长的事件才能执行, * 这样的情况下可以使用synchronized去优化代码的执行时间,也就是通常所说的减小锁的...原创 2018-06-03 17:58:26 · 610 阅读 · 0 评论 -
每天一例多线程[day8]-----AutomicInteger原子操作
即使我们使用volitile,也无法保证多线程访问共享变量的原子性,如下:package com.jeff.base.sync007;/** * * volatile关键字不具备synchronized关键字的原子性(同步) * @author jeff * */public class VolatileNoAtomic extends Thread{ private stati...原创 2018-06-03 19:23:41 · 6189 阅读 · 0 评论 -
每天一例多线程[day10]-----对象锁+wait/notify实现阻塞队列
我们利用之前学习的对象锁+wait/notify实现以下阻塞队列原创 2019-01-23 10:56:40 · 454 阅读 · 0 评论