JAVA多线程
文章平均质量分 79
JAVA多线程
冒菜-码农
且行且珍惜
展开
-
线程池实现:所有线程任务结束后执行结果输出
【代码】线程池实现:所有线程任务结束后执行结果输出。原创 2022-10-13 12:04:42 · 475 阅读 · 0 评论 -
线程池——核心线程数设置
什么是CPU密集和IO密集?粗粒度设置、利特尔法则设置、压测和利用率设置原创 2022-09-23 17:43:57 · 4758 阅读 · 0 评论 -
什么是CPU密集型、IO密集型?
CPU密集型也叫计算密集型,指的是系统的硬盘、内存性能相对CPU要好很多,此时,系统运作大部分的状况是CPU Loading 100%,CPU要读/写I/O(硬盘/内存),I/O在很短的时间就可以完成,而CPU还有许多运算要处理,CPU Loading很高。在多重程序系统中,大部份时间用来做计算、逻辑判断等CPU动作的程序称之CPU bound。例如一个计算圆周率至小数点一千位以下的程序,在执行的过程当中绝大部份时间用在三角函数和开根号的计算,便是属于CPU bound的程序。转载 2022-09-23 17:23:26 · 614 阅读 · 0 评论 -
Java多线程——如何模拟同时并发的请求?
有时需要测试一下某个功能的并发性能,又不要想借助于其他工具,索性就自己的开发语言,来一个并发请求就最方便了。java中模拟并发请求,自然是很方便的,只要多开几个线程,发起请求就好了。但是,这种请求,一般会存在启动的先后顺序了,算不得真正的同时并发!怎么样才能做到真正的同时并发呢?是本文想说的点,java中提供了闭锁 CountDownLatch, 刚好就用来做这种事就最合适了。只需要:开启n个线程,加一个闭锁,开启所有线程;待所有线程都准备好后,按下开启按钮,就可以真正的发起并发请求了。packa原创 2022-02-10 14:16:15 · 4365 阅读 · 0 评论 -
Java多线程——无锁思想/源码解读:Atomic
原子类型原子类型在java.util.concurrent.atomic包下 有四种类型(每种各3个类):基本类型AtomicInteger:原子操作整数类型AtomicBoolean:基本同上,操作布尔类型AtomicLong:基本同上,操作Long类型引用类型AtomicReference:引用普通的对象,在并发场景下修改对象时保证线程安全AtomicStampedReference:在AtomicReference基础上增加有版本号.AtomicMarkableReference:在原创 2022-02-09 09:56:45 · 484 阅读 · 0 评论 -
Java多线程——线程通信常用方式
wait/notify通信机制一个线程在使用的同步方法中时, 可能根据问题的需要, 必须使用wait() (挂起)方法使本线程等待, 暂时让出CPU的使用权, 并允许其它线程使用这个同步方法.其它线程如果在使用这个同步方法时不需要等待, 那么它用完这个同步方法的同时,应当执行notify(), notifyAll()(恢复)方法通知所有的由于使用这个同步方法而处于等待的线程结束等待.这就是wait/notify线程间通信机制.wait()/notify():都是Object类中的方法,因为任何对象都可以原创 2022-02-09 09:51:09 · 158 阅读 · 0 评论 -
Java并发——高并发编程知识体系
1.问题什么是线程的交互方式?如何区分线程的同步/异步,阻塞/非阻塞?什么是线程安全,如何做到线程安全?如何区分并发模型?何谓响应式编程?操作系统如何调度多线程?2.关键词同步,异步,阻塞,非阻塞,并行,并发,临界区,竞争条件,指令重排,锁,amdahl,gustafson3.全文概要将从线程的基础理论谈起,逐步探究线程的内存模型,线程的交互,线程工具和并发模型的发展。扫除关于并发编程的诸多模糊概念,从新构建并发编程的层次结构。4.基础理论4.1基本概念开始学习并发编程前,我们需要翻译 2022-02-08 18:15:01 · 658 阅读 · 0 评论 -
Java多线程——简单总结了几种不同的并发编程模式及框架
使用并发编程并不仅仅是为了CPU多核从而使得程序能够并行执行,其本质其实就是为了消除延迟,例如访问硬盘、网络IO等慢速的设备相对单纯的CPU计算会有很高的延迟,进而导致线程阻塞在这里等待资源,这个时候CPU的资源就白白浪费了,因此我们会根据业务场景,选择开启多个线程,将这些比较耗时的IO任务丢到另外的线程中去处理,这样就不会因为某些慢请求而影响其他用户,从而提高响应时间。因此这里就涉及到了并发模型的选型,下面我选择几种并尝试总结其优劣。Java FutureJava Future 代表一种异步计算的结果原创 2022-02-08 17:50:11 · 340 阅读 · 0 评论 -
Java多线程——工具类LongAdder
先上总结:总的来说,LongAdder从性能上来说要远远好于AtomicLong,一般情况下是可以直接替代AtomicLong使用的,Netty也通过一个接口封装了这两个类,在Java8下直接采用LongAdder,但是AtomicLong的一系列方法不仅仅可以自增,还可以获取更新后的值,如果是例如获取一个全局唯一的ID还是采用AtomicLong会方便一点。java.util.concurrency.atomic.LongAdder是Java8新增的一个类,提供了原子累计值的方法。根据文档的描述其性能原创 2022-02-08 17:45:00 · 325 阅读 · 0 评论 -
Java锁——再读ReentrantLock
ReentrantLock再阅读之前强烈建议优先了解AQS这篇文章是什么?是一个独占锁,也就是在并发环境下同一时刻只能有一个线程获得资源,也是一个可重入锁.可重入锁: 一个线程已经获取到了该资源,下次再次获取资源时不会出现等待情况(上次获取资源没有释放)怎么用?在各类并发的场景下,为了保证资源获取的正确性,可以保证每个资源同时只能被一个线程获取到.例如: 宿舍选宿系统(每张床位只能有一个学生抢到),秒杀活动(同一件商品不能被两个人买走)类架构由上面架构图可以看出,Reentra原创 2022-01-27 15:25:02 · 145 阅读 · 0 评论 -
Java并发——AQS、AQS到底什么是AQS?这玩意干啥的?
大白话简单讲就是两句话:1、是什么?AQS就是一个工具类,算是在并发情况下规范了对“资源”或者说“数据”操作的一种机制或者说是规范。专业一点的叫法是:抽象队列同步器2、这玩意干啥呢?AQS是给JAVA一系列锁以及同步器或者同步对象的底层提供了实现的框架,你也可以理解成为一种规范。就比如实现像ReentrantLock,CountDownLatch,Semaphore这样的工具。来提供一下网上比较多的两句话:AQS是什么:AQS,是AbstractQueuedSynchronizer简称,直翻过原创 2022-01-27 11:33:01 · 2651 阅读 · 0 评论 -
Java锁——分布式锁整理
引入业务场景首先来由一个场景引入:最近老板接了一个大单子,允许在某终端设备安装我们的APP,终端设备厂商日活起码得几十万到百万级别,这个APP也是近期产品根据市场竞品分析设计出来的,几个小码农通宵达旦开发出来的,主要功能是在线购物一站式服务,后台可以给各个商家分配权限,来维护需要售卖的商品信息。老板大O:谈下来不容易,接下来就是考虑如何吸引终端设备上更多的用户注册上来,如何引导用户购买,这块就交给小P去负责了,需求尽快做,我明天出差!产品小P:嘿嘿~,眼珠一转儿,很容易就想到了,心里想:“这还不简单翻译 2022-01-25 14:11:00 · 945 阅读 · 0 评论 -
Java多线程——基于优先级队列java线程池
背景最近在看同事的消息平台的问题进行优化,其中一点就是推送来的消息没有区分优先级,造成实时性要求高的不能优先满足,被全网下发的普通优先级占用了,造成消息延迟。对应的改进一点就是采用把现有线程池改为优先级队列。实现创建一个RunnablePriority,它实现Runnable接口和参数化为RunnablePriority类的Comparable接口。package thread; /** * 优先级比较 * */ public class RunnablePriority翻译 2022-01-24 20:59:44 · 728 阅读 · 0 评论 -
Java锁——搞懂ReentrantLock
回答一个问题在开始本篇文章的内容讲述前,先来回答我一个问题,为什么 JDK 提供一个 synchronized 关键字之后还要提供一个 Lock 锁,这不是多此一举吗?难道 JDK 设计人员都是沙雕吗?我听过一句话非常的经典,也是我认为是每个人都应该了解的一句话:你以为的并不是你以为的。明白什么意思么?不明白的话,加我微信我告诉你。初识 ReentrantLockReentrantLock 位于 java.util.concurrent.locks 包下,它实现了 Lock 接口和 Serializ翻译 2022-01-24 20:53:33 · 1490 阅读 · 0 评论 -
Java锁——什么是锁?
锁的概念基础与一些底层的分析翻译 2022-01-24 20:31:31 · 2241 阅读 · 0 评论 -
Java多线程——线程间的通信与数据交换
线程间的通信方式等待唤醒机制的替代:Lock 和 Conditionwait() 和 notify() 方法,只能被同步监听锁对象来调用,否则就会报出 IllegalMonitorZStateException 的异常,那么现在问题来了,我们在上一篇提到的 Lock 机制根本就没有同步锁了,也就是没有自动获取锁和自动释放锁的概念,因为没有同步锁,也就意味着 Lock 机制不能调用 wait 和 notify 方法,我们怎么办呢?好在 Java 5 中提供了 Lock 机制的同时也提供了用于 Lock原创 2022-01-19 14:03:08 · 1746 阅读 · 0 评论 -
Java多线程——生产者消费者问题
创建多个线程去执行不同的任务,如果这些任务之间有着某种关系,那么线程之间必须能够通信来协调完成工作。生产者消费者问题(英语:Producer-consumer problem)就是典型的多线程同步案例,它也被称为有限缓冲问题(英语:Bounded-buffer problem)。该问题描述了共享固定大小缓冲区的两个线程——即所谓的“生产者”和“消费者”——在实际运行时会发生的问题。生产者的主要作用是生成一定量的数据放到缓冲区中,然后重复此过程。与此同时,消费者也在缓冲区消耗这些数据。该问题的关键就是要保原创 2022-01-19 12:05:27 · 6099 阅读 · 0 评论 -
Java多线程——ThreadLocal介绍以及内存泄漏问题
ThreadLocalThreadLocal称为线程本地变量,其为变量在每个线程中都创建了一个副本,每个线程都访问和修改本线程中变量的副本,但每个线程之间的变量是不能相互访问的,ThreadLocal不是一个Thread。ThreadLocal 有四个方法:ThreadLocal作用ThreadLocal可以让线程独占资源,存储于线程内部,避免线程堵塞造成CPU吞吐下降。使用同一个threadLocal ,但每个线程的变量是独立都,对其他线程不可见,不需要每个线程都 new 一个对象,减少了内存原创 2022-01-16 10:25:09 · 549 阅读 · 0 评论 -
Java多线程——shutdown和shutdownNow的区别
shutdown和shutdownNow方法的区别shutdown => 平缓关闭,等待所有已添加到线程池中的任务执行完在关闭shutdownNow => 立刻关闭,停止正在执行的任务,并返回队列中未执行的任务shutdown和shutdownNow方法的优缺点shutdown:问:shutdown()有什么功能?答:阻止新来的任务提交,对已经提交了的任务不会产生任何影响。当已经提交的任务执行完后,它会将那些闲置的线程(idleWorks)进行中断,这个过程是异步的。问:如何原创 2022-01-14 17:17:30 · 485 阅读 · 0 评论 -
Java多线程——demo验证一下volatile的原子性
volatile介绍volatile 的作用是保证变量在多线程之间的可见性。synchronized是阻塞式同步,会在线程竞争激烈的情况下,会升级为重量级锁,还可能会死锁;而volatile是一种轻量级的同步机制。在理解这个volatile可见性之前,需要先了解一下CPU高速缓存、Java内存模型的知识。主内存:java虚拟机规定所有的变量(不是程序中的变量)都必须在主内存中产生,为了方便理解,可以认为是堆区。可以与前面说的物理机的主内存相比,只不过物理机的主内存是整个机器的内存,而虚拟机的主内存是原创 2022-01-14 14:54:08 · 394 阅读 · 0 评论 -
Java多线程——synchronized入门使用
《深入理解Java虚拟机》一句话:当多个线程访问同一个对象时,如果不用考虑这些线程在运行时环境下的调度和交替运行,也不需要进行额外的同步,或者在调用方进行任何其他的协调操作,调用这个对象的行为都可以获取正确的结果,那这个对象是线程安全的。内存分为主内存和工作内存,每个线程都有自己的工作内存,如何和主内存的数据同步,产生的数据不一致性,就是我们常说的线程安全,这就需要我们去了解Java内存模型了。借用一张图:如图为JMM抽象示意图,线程A和线程B之间要完成通信的话,要经历如下两步:线程A从主内原创 2022-01-13 19:16:58 · 312 阅读 · 0 评论 -
Java多线程——yield、notify、notifyAll、sleep、join、wait
wait ,notify / notifyAll源码public final void wait() throws InterruptedException { wait(0);}Object.wait(long)要跟Object.notify()/notifyAll()搭配使用。wait 与 notify/notifyAll 方法必须在synchronized 同步代码块中使用,即要先对调用对象加锁,不放在synchronized 中则会在program runtime时扔出“ja原创 2022-01-13 18:16:26 · 392 阅读 · 0 评论 -
Java多线程——常用阻塞队列简要说明
线程池参数的 workQueue 决定了缓存任务的排队策略,对于不同的业务场景,我们可以使用不同的排队策略。我们只需要实现BlockingQueue 这个接口即可。SynchronousQueueSynchronousQueue没有容量,是无缓冲等待队列,是一个不存储元素的阻塞队列,会直接将任务交给消费者(即丢给空闲的线程去执行),必须等队列中的添加元素被消费后才能继续添加新的元素,否则会走拒绝策略,所以使用SynchronousQueue阻塞队列一般要求maximumPoolSizes为无界,避免原创 2022-01-13 17:52:13 · 134 阅读 · 0 评论 -
Java多线程——线程池异常捕获
上一篇提到了使用ThreadFactory的UncaughtExceptionHandler去捕获线程池的错误,还有没有其他方法呢?线程的异常捕获可以使用try catch,但是主线程 如何 捕获子线程的异常呢?当一个线程执行出错了,接下来是否还要执行呢?try catch在子线程执行的方法体里面加上 try catch ,try catch 可以捕获当前线程的抛出的异常。但是try catch 无法捕获其他线程的错误。demo:public class OtherException {原创 2022-01-13 16:55:17 · 1474 阅读 · 0 评论 -
Java多线程——线程池的大小如何确定
线程的使用目的是提高运行速度,提高运行的速度是要充分使用CPU和I/O 的利用率。这就涉及到CPU密集型程序和I/O密集型程序的区别了。CPU 密集型程序CPU密集型也叫计算密集型,指的是系统的硬盘、内存性能相对CPU要好很多,此时,系统运作大部分的状况是CPU Loading 100%,CPU要读/写I/O(硬盘/内存),I/O在很短的时间就可以完成,而CPU还有许多运算要处理,CPU Loading很高。比如说要计算1+2+3+……+ 1亿、计算圆周率后几十位、数据分析。都是属于CPU密集型程原创 2022-01-13 15:26:46 · 1056 阅读 · 0 评论 -
Java多线程——Callable与Runnable的区别
Callable和Runnable的区别、future、submit 和 execute的区别原创 2022-01-07 15:56:37 · 442 阅读 · 0 评论 -
Java多线程——ThreadPoolExecutor剖析
剖析其继承与实现关系、核心参数、核心方法、任务流程等原创 2022-01-07 15:09:35 · 467 阅读 · 0 评论 -
Java多线程——线程池的ThreadPoolExecutor参数、阻塞队列、拒绝策略以及处理流程
线程池的ThreadPoolExecutor参数、阻塞队列、拒绝策略、线程工厂以及处理流程原创 2022-01-06 16:12:37 · 2851 阅读 · 0 评论 -
Java多线程——为什么要使用线程池?
为什么要使用线程池原创 2022-01-06 11:57:25 · 1445 阅读 · 0 评论 -
Java线程池为什么核心线程数为0依然能执行?
来自线程池的思考:你们的线程池博客写的真的对吗?原创 2021-12-31 18:51:56 · 6236 阅读 · 0 评论 -
Java多线程——JMM以及as-if-serial规则和happens-before规则
用大白话来理解:JMM内存模型中的重排需要遵守的两个规则:as-if-serial规则保证了不管如何重排执行结果不能被改变happens-before规则向程序员保证了代码的执行顺序,但实际具体执行顺序由JMM处理。JMM的介绍在多线程中稍微不注意就会出现线程安全问题,那么什么是线程安全问题?我的认识是,在多线程下代码执行的结果与预期正确的结果不一致,该代码就是线程不安全的,否则则是线程安全的。虽然这种回答似乎不能获取什么内容,可以google下。在<<深入理解Java虚拟机>&原创 2021-12-31 17:33:03 · 606 阅读 · 0 评论 -
Java多线程——线程的状态转换以及基本操作
新建线程一个java程序从main()方法开始执行,然后按照既定的代码逻辑执行,看似没有其他线程参与,但实际上java程序天生就是一个多线程程序,包含了:(1)分发处理发送给给JVM信号的线程;(2)调用对象的finalize方法的线程;(3)清除Reference的线程;(4)main线程,用户程序的入口。那么,如何在用户程序中新建一个线程了,只要有三种方式:1. 通过继承Thread类,重写run方法;2. 通过实现runable接口;3. 通过实现callable接口这三种方式,下面看具体de原创 2021-12-31 14:24:25 · 306 阅读 · 0 评论 -
Java多线程 单例模式的DCL问题
public class LazyInitialization{ private static Resource resource; public static Resource getResource(){ if (resource == null) resource = new Resource();//不安全! return resource; }}我们都知道上面的这个代码在单线程中运行是没有问题的,但是在平时的原创 2021-12-30 18:57:35 · 278 阅读 · 0 评论 -
JAVA多线程开发实战细节问题记录(持续更新)
临界区集合索引问题先看一张图:executorService.execute 是一个多线程会出现的问题:在多线程的情况下操作ArrayList的add()方法会出现下标越界解决问题:方式1:List list = Collections.synchronizedList(new ArrayList<>());方式2:使用 Vector方式3:volatile修饰+互斥锁,比如Synchronized...原创 2021-12-30 18:53:58 · 308 阅读 · 0 评论 -
Java多线程的一些基本概念
同步VS异步同步和异步通常用来形容一次方法调用。同步方法调用一开始,调用者必须等待被调用的方法结束后,调用者后面的代码才能执行。而异步调用,指的是,调用者不用管被调用方法是否完成,都会继续执行后面的代码,当被调用的方法完成后会通知调用者。比如,在超时购物,如果一件物品没了,你得等仓库人员跟你调货,直到仓库人员跟你把货物送过来,你才能继续去收银台付款,这就类似同步调用。而异步调用了,就像网购,你在网上付款下单后,什么事就不用管了,该干嘛就干嘛去了,当货物到达后你收到通知去取就好。并发与并行并发和并行是十原创 2021-12-30 18:45:35 · 89 阅读 · 0 评论 -
JAVA多线程——守护线程
在Java中有两类线程:User Thread(用户线程)、Daemon Thread(守护线程)用个比较通俗的比如,任何一个守护线程都是整个JVM中所有非守护线程的保姆:只要当前JVM实例中尚存在任何一个非守护线程没有结束,守护线程就全部工作;只有当最后一个非守护线程结束时,守护线程随着JVM一同结束工作。Daemon的作用是为其他线程的运行提供便利服务,守护线程最典型的应用就是 GC (垃圾回收器),它就是一个很称职的守护者。User和Daemon两者几乎没有区别,唯一的不同之处就在于虚拟机的离原创 2021-12-29 14:34:40 · 1950 阅读 · 1 评论 -
线程池随写demo
线上代码package com.gome.home.match.finance.util;import java.util.concurrent.*;public class MyTest { public static void main(String[] args) { Executor(); } private static void Executor(){ //创建线程四种方式: //1.可缓存线程池,如果线程原创 2021-02-19 16:23:05 · 149 阅读 · 0 评论 -
Java并发编程笔记之ThreadLocal内存泄漏探究
使用 ThreadLocal 不当可能会导致内存泄露,是什么原因导致的内存泄漏呢?先看下总结总结:1.ThreadLocalMap 内部 Entry 中 key 使用的是对 ThreadLocal 对象的弱引用,这为避免内存泄露是一个进步,因为如果是强引用,那么即使其他地方没有对 ThreadLocal 对象的引用,ThreadLocalMap 中的 ThreadLocal 对象还是不会被回收,而如果是弱引用则这时候 ThreadLocal 引用是会被回收掉的。2.但是对于的 value 还是不能被原创 2021-02-05 20:27:15 · 242 阅读 · 0 评论