
并发多线程
并发编程是几乎所有框架的底层基础,掌握好并发编程更有利于我们学习各种框架。想要让自己的程序执行、接口响应、批处理效率更高,必须使用并发编程。
mocas_wang
摸鱼专家
展开
-
并发编程(IO多路复用)
目录1 基础知识回顾1.1 用户空间和内核空间1.2 进程上下文切换(进程切换)1.3 进程的阻塞1.4 文件描述符1.5 直接I/O和缓存I/O1.6 同步与异步1.7 阻塞与非阻塞2 I/O模式2.1 block I/O模型(阻塞I/O)2.2 non-block(非阻塞I/O模型)2.3 I/O多路复用2.4asynchronous I/O(异步 I/O)2.5 小结3 事件驱动编程模型3.1论事件驱动3.2 看图说话讲事件驱动模..转载 2020-12-17 11:28:34 · 1244 阅读 · 0 评论 -
Java中断机制
目录1 中断2 中断的原理3 中断的处理3.1 处理时机3.2 处理方式3.3 线程在不同状态下对于中断所产生的反应4 使用 interrupt 方法4.1 使用 interrupt() + InterruptedException来中断线程4.2 使用 interrupt() + isInterrupted()来中断线程 4.3 不能结束的情况1 中断如果程序需要停止正在运行的线程,如果直接stop线程,则有可能导致程序运行不完整,因此Java提供了中断.原创 2020-12-17 10:16:50 · 380 阅读 · 0 评论 -
图解AQS实现的源码原理
1 aqs概述AQS中 维护了一个volatile int state(代表共享资源)和一个FIFO线程等待队列(多线程争用资源被阻塞时会进入此队列)。这里volatile能够保证多线程下的可见性,当state=1则代表当前对象锁已经被占有,其他线程来加锁时则会失败,加锁失败的线程会被放入一个FIFO的等待队列中,比列会被UNSAFE.park()操作挂起,等待其他获取锁的线程释放锁才能够被唤醒。另外state的操作都是通过CAS来保证其并发修改的安全性。具体原理我们可以用一张图来简单概括:原创 2020-12-16 15:28:17 · 595 阅读 · 0 评论 -
ConcurrentHashMap源码分析
目录1 ConcurrentHashMap介绍1.1 结构介绍1.2 原理介绍2 ConcurrentHashMap源码分析3 ConcurrentHashMap的同步机制4 ConcurrentHashMap扩容机制什么情况会触发扩容transfer实现扩容相关的属性transferIndex属性何时扩容1 ConcurrentHashMap介绍1.1 结构介绍ConcurrentHashMap是线程安全的哈希表。HashMap, Hashtab原创 2020-11-28 17:12:20 · 379 阅读 · 0 评论 -
Java并发编程:volatile关键字解析
目录1 内存模型的相关概念2 并发编程中的三个概念1.原子性2.可见性3.有序性 3 Java内存模型4 深入剖析volatile关键字1.volatile关键字的两层语义2.volatile保证原子性吗?3.volatile能保证有序性吗?5 使用volatile关键字的场景1 内存模型的相关概念 大家都知道,计算机在执行程序时,每条指令都是在CPU中执行的,而执行指令过程中,势必涉及到数据的读取和写入。由于程序运行过程中的临时数据是存放在主存(物理转载 2020-11-10 20:10:16 · 281 阅读 · 0 评论 -
设计模式之单例模式
目录1 简介1.1 定义1.2 为什么要用单例模式呢?1.3 为什么不使用全局变量确保一个类只有一个实例呢?2 单例模式实现2.1 饿汉方式(线程安全)2.2 懒汉式(非线程安全和synchronized关键字线程安全版本 )2.3 懒汉式(双重检查加锁版本)2.4 懒汉式(登记式/静态内部类方式)2.5 饿汉式(枚举方式)2.6 使用ThreadLocal实现2.7 使用CAS锁来实现1 简介1.1 定义所谓单例,就是整个程序有且仅有一个实例。该原创 2020-09-25 19:42:29 · 376 阅读 · 0 评论 -
生产者消费者模式-Java实现
目录1 生产者消费者模型2 生产者消费者模型的实现1. wait() / notify()方法2. await() / signal()方法3. BlockingQueue阻塞队列方法4. 信号量5. 管道1 生产者消费者模型生产者消费者问题(Producer-consumer problem),也称有限缓冲问题(Bounded-buffer problem),是一个多线程同步问题的经典案例。生产者生成一定量的数据放到缓冲区中,然后重复此过程;与此同时,消费者也在缓冲区消原创 2020-09-25 20:18:46 · 845 阅读 · 0 评论 -
简析CAS机制与实现原理
目录1 什么是CAS?2 乐观锁与悲观锁jdk1.5之前锁存在的问题:乐观锁:乐观锁的一种典型实现机制(CAS):3 JAVA对CAS的支持4 CAS的缺陷5 CAS与Synchronized的使用情景 6 JVM中的CAS(堆中对象的分配): 1 什么是CAS?CAS:Compare and Swap,即比较再交换。jdk5增加了并发包java.util.concurrent.*,其下面的类使用CAS算法实现了区别于synchronouse同步锁的一种乐转载 2020-09-24 20:58:22 · 2871 阅读 · 0 评论 -
死锁,活锁,饥饿,阻塞,无锁
目录1 死锁2 活锁3 饥饿4 阻塞5 无锁6 活锁与死锁解决方法1 死锁死锁:是指两个或两个以上的进程(或线程)在执行过程中,因争夺资源而造成的一种互相等待的现象,若无外力作用,它们都将无法推进下去。此时称系统处于死锁状态或系统产生了死锁,这些永远在互相等待的进程称为死锁进程。死锁发生的条件 互斥条件:线程对资源的访问是排他性的,如果一个线程对占用了某资源,那么其他线程必须处于等待状态,直到资源被释放。 请求和保持条件:线程T1至少已经保持了一个资源R1原创 2020-09-24 20:25:39 · 1773 阅读 · 0 评论 -
JUC简介
目录1 概述2 JUC结构3 volatile 关键字4 i++ 的原子性问题5 并发容器类ConcurrentHashMap6 关于锁的八种现象7 不安全的集合类ListSetMap1 概述在java5.0中提供了java.util.current包(简称juc),中提供了许多在并发编程工程中常用的工具类,用于定义类似于线程的自定义子系统,包括线程池、异步IO、轻量级框架、还提供了多线程上下文的Collectiion的实现。指java.util..原创 2020-09-24 09:06:53 · 1414 阅读 · 0 评论 -
Java并发之AQS详解
1 什么是AQS?AQS全名:AbstractQueuedSynchronizer,是并发容器J.U.C(java.lang.concurrent)下locks包内的一个类。它实现了一个FIFO(FirstIn、FisrtOut先进先出)的队列。底层实现的数据结构是一个双向链表。AQS的核心思想是,如果被请求的共享资源空闲,则将当前请求资源的线程设置为有效的工作线程,并将共享资源设置为锁定状态,如果被请求的共享资源被占用,那么就需要一套线程阻塞等待以及被唤醒时锁分配的机制,这个机制AQS是用CLH队原创 2020-09-22 19:33:58 · 1057 阅读 · 0 评论 -
java中wait()、this.wait()、super.wait()、object.wait()的使用区别
wait、notify和notifyAll方法是Object类的final native方法。所以这些方法不能被子类重写,Object类是所有类的超类,因此在程序中有以下三种形式调用wait等方法。wait();//方式1:this.wait();//方式2:super.wait();//方式3Object.wait()和Object.notify()和Object.notifyall()必须写在synchronized方法内部或者synchronized块内部,这是因为:这几个方法要.转载 2020-09-11 20:46:12 · 2578 阅读 · 0 评论 -
java中的各种锁
目录1 锁介绍1.1什么是锁1.2 锁粒度2 锁分类介绍2.1 乐观锁与悲观锁2.2. 自旋锁 VS 适应性自旋锁2.3. 无锁 VS 偏向锁 VS 轻量级锁 VS 重量级锁无锁偏向锁轻量级锁重量级锁2.4. 公平锁 VS 非公平锁2.5. 可重入锁 VS 非可重入锁2.6. 独享锁 VS 共享锁1 锁介绍1.1什么是锁在计算机科学中,锁(lock)或互斥(mutex)是一种同步机制,用于在有许多执行线程的环境中强制对资源的访问限制。锁旨在转载 2020-09-11 20:19:22 · 453 阅读 · 0 评论 -
线程常用方法实现
目录1 多线程创建方式1.1 继承java.lang.Thread, 重写run()方法1.2 实现java.lang.Runnable接口1.3 实现Callable接口2 currentThread()、start() 与 run()2.1 Thread.currentThread()2.2 start() 与 run()3 sleep() 、 interrupt() 、wait() 与 notify()3.1 sleep() 和interrupt()3.2 wa原创 2020-09-10 21:09:42 · 488 阅读 · 0 评论 -
Java高并发编程:线程锁技术
目录1 什么是线程锁2 synchronized1. 对象锁2. 修饰对象方法3. 类锁4. 对象锁和类锁5. 卖火车票示例6. 生产一个消费一个示例3 Lock3.1 重入锁 ReentrantLock3.2 读写锁4 Condition示例1示例25 死锁1 什么是线程锁实例的全局变量(共享资源)被修改时,会出现线程安全,需要对修改的方法加锁,注意:只要要访问多个线程共享的字段的方法都需要加锁保护。不能前门(方法A)锁上了,后门(方法B原创 2020-09-09 21:03:23 · 1658 阅读 · 0 评论 -
BlockingQueue(阻塞队列)
目录1 简介2 常用方法入队出队3 BlockingQueue的实现3.1 ArrayBlockingQueue3.1.1 put方法3.1.2 take方法3.2 LinkedBlockingQueue3.2.1 put方法3.2.2 take方法3.2.3 ArrayBlockingQueue与LinkedBlockingQueue对比3.3 LinkedBlockingDeque3.4 PriorityBlockingQueue3.4.1 p原创 2020-09-09 09:34:38 · 1915 阅读 · 0 评论 -
线程池使用和自定义线程池
目录1 线程基础概述1.1,线程池的作用1.2,为什么要用线程池?1.3,比较重要的几个类1.4,new Thread的弊端2 四种线程池2.1 源码分析2.2 RejectedExecutionHandler 线程池四种拒绝任务策略2.3 示例使用1,newCachedThreadPool2,newFixedThreadPool3,newScheduledThreadPool4,newSingleThreadExecutor1 线程基础...原创 2020-08-10 10:58:17 · 2610 阅读 · 0 评论 -
线程池原理全解析
1 线程池简介java.util.concurrent.Executors提供了一个 java.util.concurrent.Executor接口的实现用于创建线程池线程池:Java中开辟出了一种管理线程的概念,这个概念叫做线程池,从概念以及应用场景中,我们可以看出,线程池的好处,就是可以方便的管理线程,也可以减少内存的消耗。如果并发的线程数量很多,并且每个线程都是执行一个时间很短的任务就结束了,这样频繁创建线程就会大大降低系统的效率,因为频繁创建线程和销毁线程需要时间。多线程技术主要..原创 2020-08-09 20:27:17 · 2833 阅读 · 1 评论 -
多线程与并发编程入门基础,多图详解
目录1 概述1.1 多线程概念1.2 多线程的应用场景2 线程与进程2.1 概念2.2进程与线程的联系与区别:3 并行并发3.1 并行并发概念3.2 并行并发4 程序运行,线程调度4.1 抢占式调度详解4.2 主线程4.3 线程调度5 线程的状态5.1 状态示意5.2 调度示意6 线程机制6.1 线程通信方法:6.2 线程的分类:7 线程使用(续)1 概述1.1 多线程概念 如果不能从根本上更新当前C...原创 2020-08-08 15:32:32 · 955 阅读 · 1 评论