多线程
文章平均质量分 87
若曦`
成为自己的希望,成为自己的光
展开
-
Synchronized锁升级过程 学习笔记
1. 对象的存储方式对象头Mark Word(标记字段)Klass Pointer(类型指针)实例变量填充数据2. Mark Word与Synchronized锁的关系Mark Word的数据字段锁标志位没有锁 11无锁 001偏向锁 101轻量级锁 00自旋次数达到上限线程C尝试竞争锁对象重量级锁 101. 对象的存储方式要明白Synchronized锁升级过程前,我们要先知道对象在堆内存中的存储模型;堆内存中的对象分为了三块,对象头、实例变量和填充字节;对象头对象头主要包含两个部分 1. .原创 2021-09-12 23:36:18 · 415 阅读 · 0 评论 -
并发与并行、同步与异步,线程安全的实现
1. 并发与并行2. 同步与异步3. 那么什么情况下适合并发编程呢?CPU密集的情况 ForkJoin与Stream并行流的使用IO密集的情况4. 线程同步线程安全JVM内存模型中 线程私有和线程共有栈、方法区、堆 中存储的数据线程安全的数据线程不安全的数据i++的非原子性Java线程的工作内存与硬件内存的关系5. 实现线程安全对线程进行同步控制对数据进行安全控制6. for循环中为什么不能对集合进行add或remove操作 (补充知识点)1. 并发与并行并发其实是一个宽泛的概念,它代表计算机可以同时.原创 2021-09-12 12:52:46 · 538 阅读 · 0 评论 -
AQS原理探究
每个node都会放置一个volatile修饰的Thread对象原创 2021-07-14 00:28:01 · 213 阅读 · 1 评论 -
原子类与自旋锁原理初探
1. 原子性2. 原子变量(1) 内部的CAS(2) Unsafe类(3) CAS的缺点(4) 乐观锁3. 原子引用(1) AtomicReference和AtomicInteger的差异(2) 解决ABA问题自旋锁+版本(时间戳)比对源码分析使用示例4. 自旋锁自己实现一个自旋锁1. 原子性原子性是指在一个操作中就是cpu不可以在中途暂停然后再调度,既不被中断操作,要不执行完成,要不就不执行也就是一个线程在某个代码块的执行过程中,不能被其他线程抢用cpu资源而导致中断2. 原子变量此篇博客为介.原创 2021-06-04 16:16:46 · 483 阅读 · 4 评论 -
多线程下的单例模式详解
1. 单例模式(1) 单例模式简介(2) 实现方式① 饿汉式② 懒汉式2. 多线程下的单例模式(1) Synchronized(2) 双重检查锁(3) 双重检查锁+Volatile1. 单例模式(1) 单例模式简介单例模式的作用单例模式是为了确保一个类只有一个实例,而且能自行的实例化,并向整个整个系统提供这个实例单例模式的特点单例类只能有一个实例。单例类必须自己创建自己的唯一实例。单例类必须给所有其他对象提供这一实例。单例模式的使用场景整个程序的运行中只允许有一个类的实例.原创 2021-06-03 19:39:35 · 3810 阅读 · 1 评论 -
线程的异步调用 CompletableFuture简介及使用
1. CompletableFuture简介在源码中可以看出,CompletableFuture是一个泛型类,实现了Future接口和CompletionStage接口一个completetableFuture就代表了一个任务,因为继承了上述两个接口的关系,可以完成一些线程的异步调用操作异步调用的简要介绍可以看这位大佬的博客 JAVA的异步调用<a>completionStage接口的作用:支持任务完成时触发的函数和操作Future接口的作用Future 是异步计算结果的容器接口,原创 2021-06-01 21:49:55 · 5483 阅读 · 0 评论 -
ForkJoin的使用及for循环、stream并行流三种方式的时间比较
1. ForkJoin简介2. ForkJoin的使用使用步骤代码示例3. 三种方式的效率比较(1) 普通方式(For循环)(2) ForkJoin(3) Stream并行流1. ForkJoin简介ForkJoin的作用是将一个任务划分成多个小任务,让多个线程去并行执行一个任务ForkJoin内置了一个ForkJoinPool (ForkJoin线程池),当任务没有指定线程的时候,就会使用默认的ForkJoin线程池ForkJoin使用了递归算法和分治思想,Forkjoin需要在多核cpu下才会.原创 2021-06-01 19:54:45 · 1141 阅读 · 0 评论 -
多线程下的阻塞队列特性及使用
1. 队列接口的常用子接口和实现类2. BlockingQueue(阻塞队列)四组API(1) ArrayBlockingQueue① 构造函数的源码解析及公平与非公平访问公平访问与非公平访问的说明② 使用示例③ 使用put()和take()的特性,解决生产者与消费者问题(2) LinkedBlockingQueue构造函数的源码分析使用方法3. LinkedBlockingQueue和ArrayBlockingQueue的差别1. 队列接口的常用子接口和实现类2. BlockingQueue(阻塞.原创 2021-05-31 19:04:03 · 440 阅读 · 0 评论 -
集合的常用线程安全实现类使用及源码分析
1. 并发修改异常问题的产生2. CopyOnWriteArrayList(1) 源码分析① 构造函数② add()方法的实现(2) 使用2. CopyOnWriteArraySet(1) 源码分析① 构造函数② add()方法的实现(2) 使用3. ConcurrentHashMap1. 并发修改异常问题的产生当多个线程同时去操作一个数据/集合的时候,就会产生并发修改异常,因为同一数据不允许同时被多个线程操作代码示例创建一个ArrayList,开启一百个线程,每个都往集合里添加一个a,结束后打印.原创 2021-05-30 15:58:58 · 244 阅读 · 0 评论 -
多线程下的生产者与消费者模式及(notify()与signal()唤醒的使用和区别)
1. 问题的起源用现实中的快餐店:生产一个汉堡消费一个汉堡为例代码如下// 多线程下的生产者与消费者模式public class bounded_buffer_Problem { public static void main(String[] args) { HamburgerShop hamburgerShop = new HamburgerShop(); // 开启一个生产者线程,for循环1000次,生产1000个汉堡 new Thr原创 2021-05-29 15:40:14 · 921 阅读 · 0 评论 -
JUC工具包之加法、减法计数器、信号量
1. CountDownLatch(减法计数器)(1) 用法一(发令枪)(2) 用法二(记录所有线程的开始或结束时刻)2. CyclicBarrier(加法计数器)1. CountDownLatch(减法计数器)CountDownLatch 被人称作减法计数器,实际应用的时候,按照JDK文档的解释,可以有两种场景适用。用法一是作为发令枪,一个线程拿着发令枪,下令使其他多个线程同时开始进行用法二是观察所有线程的开始或结束时刻,比如公交车需要等所有乘客上车才能关门,或者是所有乘客下车才能关门,也就是当.原创 2021-05-28 12:41:40 · 651 阅读 · 0 评论 -
一个例子说清valotile关键字的作用
一句话总结volatile:volatile的作用即是让主内存中的数据对线程可见下面就用一个例子来说清valotile的作用我们先来看下例代码public class Test { private static int num=0; // 定义一个静态变量num=0 public static void main(String[] args) { new Thread(()->{ //开启一个线程 while(num==0){ //如果原创 2021-05-11 18:50:31 · 1255 阅读 · 1 评论 -
java线程池总结(ThreadPoolExecutor与Executors特性及使用)
1. 线程池简介线程池是指预先创建好一定数量的线程对象,存入缓冲池中,需要用的时候直接从缓冲池中取出,线程结束之后会再回到缓冲池中线程池在java中用ThreadPoolExecutor实现线程池的优点① 提高线程的利用率② 提高响应速度③ 便于统一管理线程对象④ 可以控制最大的并发数2. 线程池的使用(1) 使用原生的ThreadPoolExecutor(2) 使用Executors 工具类Executor接口的3种实现① newSingleThreadExecutor(); /原创 2021-05-11 11:31:55 · 419 阅读 · 0 评论 -
synchronized、Lock接口、Condition接口、读写锁及ReentrantLock(重入锁) 特性及使用
1. synchronized2. ReentrantLock(重入锁)原创 2021-05-09 20:24:10 · 292 阅读 · 0 评论 -
java多线程总结
1. 多线程简介2. java中多线程的使用(1) java中开启多线程的方法(2) 不同方式开启线程的区别(3) 线程的5种状态1. 多线程简介在了解线程前,要先明白进程进程是计算机正在运行的一个独立的应用程序线程是组成进程的基本单位,可以完成特定的功能,一个进程是由一个或多个线程组成的多线程是指在一个进程中,多个线程同时执行,这里说的同时执行并不是真正意义的同时执行系统会为每个线程分配 CPU 资源,在某个具体的时间段内 CPU 资源会被一个线程占用在不同的时间段内由不同的线程来占用 C.原创 2021-05-08 18:46:10 · 152 阅读 · 1 评论