
并发
ReycoChou
这个作者很懒,什么都没留下…
展开
专栏收录文章
- 默认排序
- 最新发布
- 最早发布
- 最多阅读
- 最少阅读
-
玩转并发-自定义线程池
线程池原理所谓线程池,通俗地理解就是有一个池子,里面存放着已经创建好的线程。当有任务提交给线程池时,池子中的某个线程会主动执行该任务。如果池子中的线程数量不足够应付数量众多的任务时,则需要自动扩充新的线程到池子;当任务比较少时,池子中的线程能够自动回收,释放资源。为了能够让异步地提交任务和缓存未处理的任务,需要有一个任务队列。一个完整的线程池具备的要素:任务队列:存放Runnable线程...原创 2019-02-15 00:07:03 · 220 阅读 · 0 评论 -
玩转java并发-从创建线程开始
创建并启动线程创建一个线程,并重写其run()方法启动新的线程,调用Thread的start方法,才代表派生了一个新的线程,否则Thread和其他的java对象没什么区别,start()是一个立即返回的方法,不会让线程陷入阻塞。注意:当启动JVM时,从操作系统就会创建一个新的进程(JVM进程),JVM进程会派生或者创建其他线程,其中main方法就是主线程。JVM启动后,实际上由多个线程...原创 2019-02-12 17:07:22 · 185 阅读 · 0 评论 -
玩转并发-深入理解Thread构造函数
线程的默认命名下面的几个构造函数,并没有为线程提供命名的参数,那么此时线程会有怎样的命名呢?Thread()Thread(Runnable target)Thread(ThreadGroup group, Runnable target)打开JDK的源码:public Thread() { init(null, null, "Thread-" + nextThread...原创 2019-02-12 20:31:40 · 320 阅读 · 0 评论 -
玩转并发-线程优先级-Interrupt
线程优先级理论上是线程优先级高的会获取优先被CPU调度的机会,但是事实并非如我们所愿,设置线程的优先级是一个hint操作(暗示)。对于root用户,它会hint操作系统你想要设置的优先级级别,否则它会被忽略如果CPU比较忙,优先级高的可能会获得更多时间片,但是闲时优先级的高低几乎不会有任何作用,或者说没有什么区别线程优先级源码剖析public final void setPriori...原创 2019-02-13 10:44:43 · 179 阅读 · 0 评论 -
玩转并发-Atomic包和CAS原理
概述JDK1.5之后的java.util.concurrent.atomic包里,多了一批原子处理类。AtomicBoolean、AtomicInteger、AtomicLong、AtomicReference。主要用于在高并发环境下的高效程序处理,来帮助我们简化同步处理.AtomicIntegerAtomicInteger提供原子操作Integer的类。在Java语言中,i++和++i操作...原创 2019-02-18 23:18:22 · 335 阅读 · 0 评论 -
玩转并发-线程安全与数据同步
初识synchronizedsynchronized关键字可以实现一个简单的策略来防止线程干扰和内存一致性错误。如果一个对象对多个线程是可见的,那么对该对象的读/写都该通过同步的方式实现:synchronized关键字包括monitor enter和monitor exit两个JVM指令,能够保证在任何时候任何线程执行到monitor enter成功之前都必须从主存中获取数据,而不是从缓存中...原创 2019-02-13 15:10:40 · 168 阅读 · 0 评论 -
玩转并发-捕获线程运行期间的异常
为什么捕获多线程运行期间异常在讲为什么要捕获多线程运行期间异常时,先写个栗子:public class MyThread { public static void main(String[] args) { Thread thread = new Thread() { @Override public void run() { throw new RuntimeExc...原创 2019-02-13 22:16:00 · 135 阅读 · 0 评论 -
玩转并发-深入AQS和CountDownLatch
概述CountDownLatch中count down是倒数的意思,latch则是门闩的含义。整体含义可以理解为倒数的门栓,似乎有一点“三二一,芝麻开门”的感觉。CountDownLatch的作用也是如此,在构造CountDownLatch的时候需要传入一个整数n,在这个整数“倒数”到0之前,主线程需要等待在门口,而这个“倒数”过程则是由各个执行线程驱动的,每个线程执行完一个任务“倒数”一次。总...原创 2019-02-19 17:15:03 · 408 阅读 · 0 评论 -
玩转并发-深入剖析AQS
概述AQS(AbstractQueuedSynchronizer类)是一个用来构建锁和同步器的框架,它在内部定义了一个int state变量,用来表示同步状态.在LOCK包中的相关锁(常用的有ReentrantLock、 ReadWriteLock)都是基于AQS来构建。AQS原理AQS是通过一个双向的FIFO,依赖队列来完成同步状态的管理,当前线程如果获取同步状态失败时,AQS则会将当前线...原创 2019-02-19 20:16:19 · 326 阅读 · 0 评论 -
玩转并发-初识JUC
本博客转自此concurrent包的结构层次在针对并发编程中,Doug Lea大师为我们提供了大量实用,高性能的工具类,针对这些代码进行研究会让我们队并发编程的掌握更加透彻也会大大提升我们队并发编程技术的热爱。这些代码在java.util.concurrent包下。如下图,即为concurrent包的目录结构图其中包含了两个子包:atomic以及lock,另外在concurrent下的阻塞...转载 2019-03-06 16:52:10 · 281 阅读 · 0 评论 -
玩转并发-ReentrantLock
概述eentrantLock重入锁,是实现Lock接口的一个类,也是在实际编程中使用频率很高的一个锁,支持重入性,表示能够对共享资源能够重复加锁,即当前线程获取该锁再次获取不会被阻塞。在java关键字synchronized隐式支持重入性(关于synchronized可以看这篇文章),synchronized通过获取自增,释放自减的方式实现重入。与此同时,ReentrantLock还支持公平锁和...原创 2019-03-06 17:54:11 · 961 阅读 · 0 评论 -
玩转并发-ReentrantReadWriteLock
概述在某些业务场景下,出现读多写少的情况,如果我们依然使用独占式锁会导致性能下降。对这种读多写少的情况,java还提供了另外一个实现Lock接口的ReentrantReadWriteLock(读写锁)。读写所允许同一时刻被多个读线程访问,但是在写线程访问时,所有的读线程和其他的写线程都会被阻塞读写锁:分为读锁和写锁,多个读锁不互斥;读锁与写锁互斥,写锁之间也互斥。锁降级:从写锁变成读锁锁...原创 2019-03-07 12:15:13 · 276 阅读 · 0 评论 -
玩转并发-Semaphore信号量
概述Semaphore通常用于限制可以访问某些资源的线程数组。Semaphore称为计数信号量,它允许n个任务同时访问某个资源,可以将信号量看作是在向外分发使用资源的许可证,只有成功获取许可证,才能使用资源。Demo#利用Semphore制作Lockpublic static void lock() throws InterruptedException { semaphore.acq...原创 2019-03-07 16:04:51 · 143 阅读 · 0 评论 -
玩转并发-ThreadPoolExecutor
本文转自此博客概述首先看一个线程池的流程图:调用ThreadPoolExecutor的execute提交线程,首先检查CorePool,如果CorePool内的线程小于CorePoolSize,新创建线程执行任务如果当前CorePool内的线程大于等于CorePoolSize,那么将线程加入到BlockingQueue此处贴链接学BlockingQueue如果不能加入Blcoking...转载 2019-03-08 09:03:07 · 1358 阅读 · 0 评论 -
玩转java内存模型-基础
并发编程模型的分类线程之间如何通信和如何保持同步是是两个关键的问题。先解决线程之间通信的问题。线程之间的通信机制有两种:第一种是共享内存;第二种是消息传递。在共享内存中,线程之间通过"读-写"线程中的公共区域来隐式地通信。消息传递机制下,线程之间没有公共区域,需要显式进行通信。接着说下同步。在共享内存机制下,线程的同步需要显式地指定代码块或方法来实现;在消息传递机制下,由于消息的发生在消息的...转载 2019-02-11 16:52:15 · 110 阅读 · 0 评论 -
玩转java并发-重排序
概述在执行排序时,为了提高效率,处理器和编译器会对指令进行重排序。重排序需要满足规则:单线程环境下,不能改变程序运行的结果存在数据依赖关系的不允许重排序as-if-serial语义as-if-serial语义的意思是所有的操作可以为了优化而重排序,但是必须保证重排序的后的结果和原来一样。编译器,runtime,处理器必须满足as-if-serial语义。注意:as-if-serial...原创 2019-02-11 15:42:10 · 166 阅读 · 0 评论 -
玩转并发-Worker Thread设计模式
概述Worker Thread设计模式有时也称为流水线设计模式,这种设计模式类似于工厂流水线。在Worker Thread模式中,工人线程Worker thread会逐个取回工作并进行处理,当所有工作全部完成后,工人线程会等待新的工作到来。核心类类名说明Request发起请求的类Channel流水线:接收请求并将请求推送给送人TransportThrea...原创 2019-02-16 23:52:17 · 390 阅读 · 0 评论 -
玩转并发-单线程执行设计模式
概述Single Thread Execution模式是指同一时刻只能有一个线程去访问共享资源,就像独木桥一次通过一个人一样。简单来说,Single Thread Execution就是采用排他式操作保证同一时刻只能有一个线程访问共享资源。有一个门始终只能一个人通过先写个线程不安全的栗子:package com.Reyco.MyThread;public class Gate { ...原创 2019-02-15 20:31:15 · 286 阅读 · 0 评论 -
玩转并发-多线程读写锁分离设计模式
概述在多线程的情况下访问共享资源,需要对资源进行同步操作以防止数据不同步的情况发生,通常我们用synchronized关键字或显氏锁。对资源的访问一般包括两种类型的动作,读和写。如果多个线程在某个时刻对资源进行读操作,这时用排他的方式加锁,就显得简单粗暴,降低执行效率。如果的某个资源的读操作多于写操作,那么读时不加锁,很明显能很好地提升性能。多线程访问concern和conflict...原创 2019-02-15 22:30:40 · 318 阅读 · 0 评论 -
玩转并发-多线程不可变对象设计模式
概述无论是synchronized关键字还是显氏锁Lock,都会牺牲系统的性能。不可变对象一定是线程安全的。定义不可变类package com.Reyco.MyThread;public final class Person { private final String name; private final String address; public String getNa...原创 2019-02-15 23:19:40 · 186 阅读 · 0 评论 -
玩转并发-多线程Future设计模式
概述原创 2019-02-16 10:54:50 · 267 阅读 · 0 评论 -
玩转并发-Guarded-Suspension设计模式
概述Suspension是挂起的意思,而Guarded则是担保的意思,连在一起的意思就是确保挂起。当线程在访问某个对象时,发现条件不满足,就暂时挂起等待条件满足再次访问...原创 2019-02-16 14:29:36 · 220 阅读 · 0 评论 -
玩转并发-ThreadLocal
概述ThreadLocal是一个本地线程副本变量工具类。主要用于将私有线程和该线程存放的副本变量进行映射,各个线程之间变量互不干扰。如何使用先看个简单的栗子学习如何使用ThreadLocalpublic static void main(String[] args) throws NoSuchFieldException, SecurityException, IllegalArgume...原创 2019-02-16 16:16:44 · 290 阅读 · 0 评论 -
玩转并发-多线程运行上下文设计模式
概述上下文是贯穿整个系统或阶段生命周期的对象,其包含了系统全局的一些信息,比如登录之后的用户信息,账号信息以及程序每一个阶段运行时的数据。线程上下文设计在有些时候,单个线程执行的任务步骤会非常多,后一个步骤的输入有可能是前一个步骤的输出,比如在单个线程多步骤执行时,为了使得功能单一,有时候我们会采用GOF职责链设计模式。上下文context:public class MyContext...原创 2019-02-16 20:35:28 · 587 阅读 · 0 评论 -
玩转并发-多线程Balking设计模式
概述多个线程监控某个共享变量,A线程监控到共享变量发生变化后即将触发某个动作,但是此时发现有另外一个线程B已经针对该变量开始了行动,因此A放弃了准备开始的动作,我们把这样的线程间交互称为Balking(犹豫)设计模式。比如,我们在用文档编辑时,每次的文字编辑都代表文档的状态发生了改变,除了我们可以手动保存文档之外,word软件本身也会定期触发自动保存。如果word自动保存文档的线程正准备执行保...原创 2019-02-16 21:07:52 · 210 阅读 · 0 评论 -
玩转并发-多线程Count Down设计模式
概述Count-Down设计模式其实也叫做Latch(阀门)设计模式。当若干个线程并发执行完某个特定的任务,然后等到所有的子任务都执行结束之后再统一汇总。JDK自带CountDownLatch:public static void main(String[] args) throws InterruptedException { //设置countdown为5 CountDownL...原创 2019-02-16 21:37:11 · 513 阅读 · 1 评论 -
玩转并发-多线程Per-Message设计模式
概述Thread-Per-Message的意思是为每一个消息的出来开辟一个线程使得消息能够以并发的方式进行处理,从而提高整个系统的吞吐量。这就好比电话接线员,收到的每一个电话都会交由一个工作人员处理。定义Message类:public class Message { private int value; public Message(int value) { this.value...原创 2019-02-16 22:06:33 · 172 阅读 · 0 评论 -
玩转java并发-synchronized
synchronized实现原理Java中每一个对象都可以作为锁,这是synchronized实现同步的基础:普通同步方法-锁是当前实例对象静态同步方法-锁是当前类对象同步方法块-锁是当前代码块当一个线程访问同步代码块时,它首先是需要得到锁才能执行同步代码,当退出或者抛出异常时必须要释放锁,那么它是如何来实现这个机制的呢? public synchronized void test...原创 2019-02-11 10:28:10 · 228 阅读 · 0 评论 -
玩转java并发-volatile
volatile概述volatile是Java提供的一种轻量级的同步机制,在并发编程中,它也扮演着比较重要的角色。同synchronized相比(synchronized通常称为重量级锁),volatile更轻量级,系统开销比较小。如果一个变量用volatile修饰了,则所有线程看到这个变量的值是一致的,如果某个线程对这个变量进行了更新,则其他的线程可以立马看到这个更新,这就是线程可见性。在其...原创 2019-02-11 11:06:18 · 159 阅读 · 0 评论 -
玩转java并发-happens-before
概述在JVM中,如果一个操作执行的结果需要对另一个操作可见,那么这两个操作之间必须存在happens-before关系。happens-before是判断数据是否竞争,线程是否安全的主要依据。依靠这个原则,我们解决在并发环境下两操作之间是否可能存在冲突的所有问题i=1;//线程A操作j=i;//线程B操作j是否会等于1.这取决于happens-before。如果线程A的操作(i=1)ha...原创 2019-02-11 11:23:58 · 195 阅读 · 0 评论 -
玩转并发-Executors框架
从Executor谈起Executor该接口的目的是解耦任务本身和任务的执行。public interface Executor { //Executor接口中只包含execute方法,该方法传入实现了Runnable接口的类 void execute(Runnable command);}Executor仅仅是一个接口,根据子类的不同实现,执行任务的具体方式也不同增强的Ex...转载 2019-03-08 08:41:25 · 258 阅读 · 0 评论