
多线程
文章平均质量分 78
Micrle_007
这个作者很懒,什么都没留下…
展开
-
CompletableFuture 异步关于异常的坑
在使用异步CompletableFuture时,无论是否有返回值都要调用get()/join()方法,避免程序执行报错了,仍然返回成功。结果:接口返回成功,控制台打印异步线程异常日志,主线程没有打印异常日志。结果:结果返回成功,控制台打印异步线程异常信息,主线程没有打印异常信息。结果:结果返回成功,控制台打印异步线程异常信息,主线程没有打印异常信息。处理,如果只是对异常做处理,不涉及对上一个异步任务结果的情况,调用。结果:接口返回失败,控制台打印异常日志。结果:接口返回成功,控制台打印异常信息。原创 2024-05-14 20:34:49 · 553 阅读 · 0 评论 -
ThreadLocal和Synchronized的用法和区别
和。原创 2023-12-22 13:46:00 · 411 阅读 · 0 评论 -
TaskDecatator用法
方法的目的是让你可以在实际的任务执行之前,对任务进行一些额外的处理。只是一个自定义装饰行为的接口,具体的上下文传递逻辑需要根据你的实际应用场景来设计。例如,在执行异步操作时,你可能需要将主线程的一些上下文信息(比如用户身份验证令牌或请求上下文信息)传递给执行异步操作的线程。,它会捕获提交任务时当前线程的上下文,并在任务实际执行前将这个上下文设置到执行任务的线程中。方法中的逻辑会在你的任务代码之前执行,允许你设置或者修改线程的状态,以便这些状态可以在任务执行时被使用。方法,然后再执行你的任务代码。原创 2023-12-19 14:57:30 · 1773 阅读 · 0 评论 -
线程安全问题解析
多线程问题的根本原因是由于多个线程同时操作了同一个对象的成员变量,而且这个变量没有做同步处理,这就会有多线程问题,所以如果一个对象没有成员变量,那么就不会有多线程问题,因为如果一个对象只有方法的话,那么方法是在线程自己的内存空间执行的(线程内存里有栈帧,就是用来执行方法),所以在方法内所产生的对象都是存储在线程自己的内存空间的,不存在线程安全问题。这时候线程2 修改的数据在save到主内存之前,线程1是可见的,也就是说线程1的修改被线程2覆盖掉了,就破坏了线程1的原子性。5. 线程执行方法的过程。原创 2023-11-10 14:36:26 · 261 阅读 · 0 评论 -
ThreadLocal用法
是的,使用同步可以解决问题,但是我们要看哪一种方式更合适,一般必须使用同步的场景是这个变量属于业务共享的,也就是说一个线程操作这个对象对别的线程是有业务影响的,是有业务逻辑关系的,再或者说其他线程操作这个变量要看当前线程操作的结果,比如商品库存,这个你总不能说用 ThreadLocal 去定义这个库存吧,那岂不是要疯了。这样,每个线程独立的拥有对象 t,虽然方法是公用的,但是里面的 t 对象是线程独有的,所有就解决了冲突问题。原创 2023-11-05 21:32:05 · 273 阅读 · 0 评论 -
面试突击41:notify是随机唤醒吗?
做 Java 开发的小伙伴,对 wait 方法和 notify 方法应该都比较熟悉,这两个方法在线程通讯中使用的频率非常高,但对于 notify 方法的唤醒顺序,有很多小伙伴的理解都是错误的,有很多人会认为 notify 是随机唤醒的,但它真的是随机唤醒的吗?带着这个疑问,我们尝试休眠 100 个线程,再唤醒 100 个线程,并把线程休眠和唤醒的顺序保持到两个集合中,最后再打印一下这两个集合,看一下它们的执行顺序,如果它们的顺序是一致的,那说明 notify 是顺序唤醒的,否则则是随机唤醒的,notif转载 2022-04-22 10:45:51 · 623 阅读 · 0 评论 -
用户级线程和内核级线程
用户级线程#“既然你已经看过线程的基本概念,那我就直接跳过这一部分了。很久很久之前,线程的概念是出现了,但操作系统厂商可不能直接就去修改操作系统的内核,因为对他们来说,稳定性是最重要的。贸然把未经验证的东西加入内核,出问题了怎么办?所以想要验证线程的可用性,得另想办法。”“我知道我知道,那些研究人员就编写了一个关于线程的函数库,用函数库来实现线程!”小白得意的说:“这个我刚刚在网上看到了。”“是的,他们把创建线程、终止线程等功能放在了这个线程库内,用户就可以通过调用这些函数来实现所需要的功能。”转载 2022-03-10 09:35:37 · 4233 阅读 · 2 评论 -
当synchronized遇上integer
前几天在某技术平台上看到别人提的关于 Synchronized 的一个用法问题,我觉得挺有意思的,这个问题其实也是我三年前面试某公司的时候遇到的一个真题,当时不知道面试官想要考什么,没有回答的特别好,后来研究了一下就记住了。所以看到这个问题的时候觉得特别亲切,准备分享给你一起看看:首先为了方便你看文章的时候复现问题,我给你一份直接拿出来就能跑的代码,希望你有时间的话也把代码拿出来跑一下:publicclassSynchronizedTest{publicstaticv...转载 2022-02-23 09:23:21 · 443 阅读 · 0 评论 -
ArrayList非线程安全
new ArrayList () 会创建一个容量为10的Object数组,ArrayList每次扩容是原来的一半(oldCapacity + (oldCapacity >> 1)),ArrayList是线程不安全的。ArrayList线程不安全的代码import java.util.ArrayList;import java.util.List;import java.util.UUID;/** * ArrayList线程不安全的代码 */public class Arr转载 2021-09-22 22:25:22 · 327 阅读 · 0 评论 -
6种 分布式限流方案,我替你整理好了
限流分类限流的实现方案有很多种,磊哥这里稍微理了一下,限流的分类如下所示:合法性验证限流:比如验证码、IP 黑名单等,这些手段可以有效的防止恶意攻击和爬虫采集; 容器限流:比如 Tomcat、Nginx 等限流手段,其中 Tomcat 可以设置最大线程数(maxThreads),当并发超过最大线程数会排队等待执行;而 Nginx 提供了两种限流手段:一是控制速率,二是控制并发连接数; 服务端限流:比如我们在服务器端通过限流算法实现限流,此项也是我们本文介绍的重点。合法性验证限流为最常规的业务代转载 2021-08-23 16:49:39 · 4837 阅读 · 0 评论 -
ThreadLocal的使用
作者:敖丙链接:https://www.zhihu.com/question/341005993/answer/1367225682来源:知乎著作权归作者所有。商业转载请联系作者获得授权,非商业转载请注明出处。面试官说实话我在实际开发过程中用到ThreadLocal的地方不是很多,我在写这个文章的时候还刻意去把我电脑上几十个项目打开之后去全局搜索ThreadLocal发现除了系统源码的使用,很少在项目中用到,不过也还是有的。ThreadLocal的作用主要是做数据隔离,填充的数据只属于.转载 2021-08-09 12:28:48 · 4284 阅读 · 0 评论 -
wait方法为什么要放在循环里
java在使用内置锁实现消费者-生产者模式的时候,可以使用wait,notify,notifyAll三个方法,而且这三个方法都是基类Object的方法,要调用某一个对象的同步方法时,必须将其放在sycronized修饰的方法、对象、代码块里面,你必须先持有对象上的锁,才能在某个条件下,修改其等待状态,下面给出了使用同步方法的标准代码模式:synchronized (obj) { while (<condition does not hold>竞态条件) ...转载 2021-05-21 10:39:04 · 469 阅读 · 0 评论 -
Java线程池在业务中的实践
业务背景在当今的互联网业界,为了最大程度利用CPU的多核性能,并行运算的能力是不可或缺的。通过线程池管理线程获取并发性是一个非常基础的操作,让我们来看两个典型的使用线程池获取并发性的场景。场景1:快速响应用户请求描述:用户发起的实时请求,服务追求响应时间。比如说用户要查看一个商品的信息,那么我们需要将商品维度的一系列信息如商品的价格、优惠、库存、图片等等聚合起来,展示给用户。分析:从用户体验角度看,这个结果响应的越快越好,如果一个页面半天都刷不出,用户可能就放弃查看这个商品了。而面向用户的功原创 2021-04-17 21:24:34 · 459 阅读 · 0 评论 -
10个线程同时执行i++操作1000次,如何保证结果是1w
先看代码: private static int s=0; public static void main(String[] args) throws InterruptedException { for (int j=0;j<10;j++){ Thread thread = new Thread(()->{ for (int k=0;k<1000;k++){原创 2021-04-11 11:02:37 · 1665 阅读 · 0 评论 -
ThreadLocal的作用
对于多任务,Java标准库提供的线程池可以方便地执行这些任务,同时复用线程。Web应用程序就是典型的多任务应用,每个用户请求页面时,我们都会创建一个任务,类似:public void process(User user) { checkPermission(); doWork(); saveStatus(); sendResponse();}然后,通过线程池去执行这些任务。观察process()方法,它内部需要调用若干其他方法,同时,我们遇到一个问题:如何在转载 2021-04-08 22:09:43 · 225 阅读 · 0 评论 -
Object类的wait和notify详解
前言前面介绍了Synchronized关键词的原理与优化分析,Synchronized的重要不言而喻, 而作为配合Synchronized使用的另外两个关键字也显得格外重要.今天, 来聊聊配合Object基类的 wait() notify() 这两个方法的实现,为多线程协作提供了保证。wait() & notify()Object 类中的 wait¬ify 这两个方法,其实包括他们的重载方法一共有 5 个,而 Object 类中一共才 12 个方法,转载 2021-04-06 15:08:59 · 2746 阅读 · 0 评论 -
ExecutorService的shutDown和shutDownNow方法的区别
shutDown方法,引用官方注释:/** * Initiates an orderly shutdown in which previously submitted * tasks are executed, but no new tasks will be accepted. * Invocation has no additional effect if already shut down. * * <p>This method do原创 2020-12-18 14:12:15 · 242 阅读 · 0 评论 -
cpu使用率偏高如何排查
记录一次线上服务器出现cpu占用过高,避免之后再次出现相关问题,这里记录一下用代码模拟cpu 占用过高进行排查新建一个web项目,这里以springboot为例子新建一个web项目package com.wanjun.jvm;import org.springframework.boot.SpringApplication;import org.springframework.boot.autoconfigure.SpringBootApplication;import o..转载 2020-12-10 19:27:32 · 1353 阅读 · 0 评论 -
如何设置核心线程数
线程池合理的线程数你是如何考虑的?这也是之前面试遇到的一个题:1.先看下机器的CPU核数,然后在设定具体参数:System.out.println(Runtime.getRuntime().availableProcessors());即CPU核数 =Runtime.getRuntime().availableProcessors()2.分析下线程池处理的程序是CPU密集型,还是IO密集型CPU密集型:核心线程数 = CPU核数+ 1IO密集型:核心线程数 = CPU核数 * 2..转载 2020-11-11 19:59:10 · 986 阅读 · 0 评论 -
线程池详解
目录线程池内部结构使用线程池比手动创建线程好在哪里?线程池相关类与接口线程池的各个参数及创建过程?线程池的四种拒绝策略?常见的六种线程池?ForkJoinPool线程池常用的阻塞队列有哪些?合适的线程数量是多少?CPU 核心数和线程数的关系?CPU 密集型任务耗时 IO 型任务 结论 如何根据实际需要,定制自己的线程池?核心线程数阻塞队列线程工厂拒绝策略总结如何正确关闭线程池?shutdown ...转载 2020-11-10 08:35:41 · 352 阅读 · 0 评论 -
已经有了Thread为什么还要Runnable
1:通过继承Thread类的方式,可以完成多线程的建立。但是这种方式有一个局限性,如果一个类已经有了自己的父类,就不可以继承Thread类,因为java单继承的局限性。可是该类中的还有部分代码需要被多个线程同时执行。这时怎么办呢?只有对该类进行额外的功能扩展,java就提供了一个接口Runnable。这个接口中定义了run方法,其实run方法的定义就是为了存储多线程要运行的代码。所以,通常创建线程都用第二种方式。因为实现Runnable接口可以避免单继承的局限性。2:其实是将不同类中需要被多线程执转载 2020-10-15 09:06:36 · 693 阅读 · 0 评论 -
violate详解
一、Volatile怎么念?看到这个单词一直不知道怎么发音英 [ˈvɒlətaɪl] 美 [ˈvɑːlətl]adj. [化学] 挥发性的;不稳定的;爆炸性的;反复无常的那Java中volatile又是干啥的呢?二、Java中volatile用来干啥?Volatile是Java虚拟机提供的轻量级的同步机制(三大特性) 保证可见性 不保证原子性 禁止指令重排 要理解三大特性,就必须知道Java内存模型(JMM),那JMM又是什么呢?三、JMM..转载 2020-10-14 09:21:53 · 2094 阅读 · 0 评论 -
violate详解
一、Volatile怎么念?看到这个单词一直不知道怎么发音英 [ˈvɒlətaɪl] 美 [ˈvɑːlətl]adj. [化学] 挥发性的;不稳定的;爆炸性的;反复无常的那Java中volatile又是干啥的呢?二、Java中volatile用来干啥?Volatile是Java虚拟机提供的轻量级的同步机制(三大特性) 保证可见性 不保证原子性 禁止指令重排 要理解三大特性,就必须知道Java内存模型(JMM),那JMM又是什么呢?三、JMM..转载 2020-10-14 09:21:15 · 2715 阅读 · 0 评论 -
synchronized几种常见用法
我们都知道 Synchronized 是线程安全同步用的,大部分程序可能只会用到同步方法上面。其实 Synchronized 可以用到更多的场合,栈长列举了以下几个用法。1、同步普通方法这个也是我们用得最多的,只要涉及线程安全,上来就给方法来个同步锁。这种方法使用虽然最简单,但是只能作用在单例上面,如果不是单例,同步方法锁将失效。/** * 用在普通方法 */private synchronized void synchronizedMethod() { System.out.p转载 2020-10-12 08:58:16 · 279 阅读 · 0 评论 -
java 线程的执行原理
https://www.cnblogs.com/LeeMengxu/articles/LeeMengxu.html猜大家都很了解线程的使用了,现在我们以java为例,来看看线程是怎样在底层(jvm里面)产生和运行的。线程控制模块:当我们构造一个线程,java虚拟机会在内存中生成一个线程控制块,其中包括PC寄存器、Java栈、本地方法栈,这是每个线程独自拥有的,互不干涉。PC计数器存放当前正在被执行的字节码指令(JVM指令)的地址。说白了,就是PC计数器用来记住这个线程被执行到那一步了(方...转载 2020-08-04 13:24:36 · 296 阅读 · 0 评论 -
线程池的深入理解
https://zhuanlan.zhihu.com/p/158737142一、概述1、问题先看我们遇到的问题:我们创建线程的方式很简单,new Thread(() -> {...}),就是因为这么简单粗暴的方式,才带来了致命的问题。首先线程的创建和销毁都是很耗时很浪费性能的操作,你用线程为了什么?为了就是异步,为了就是提升性能。简单的new三五个Thread还好,我需要一千个线程呢?你也for循环new1000个Thread吗?用完在销毁掉。那这一千个线程的创建和销毁的性能是很糟糕的!转载 2020-08-03 10:41:26 · 1214 阅读 · 1 评论 -
CountDownLatch理解
CountDownLatch概念CountDownLatch是一个同步工具类,用来协调多个线程之间的同步,或者说起到线程之间的通信(而不是用作互斥的作用)。CountDownLatch能够使一个线程在等待另外一些线程完成各自工作之后,再继续执行。使用一个计数器进行实现。计数器初始值为线程的数量。当每一个线程完成自己任务后,计数器的值就会减一。当计数器的值为0时,表示所有的线程都已经完成一些任务,然后在CountDownLatch上等待的线程就可以恢复执行接下来的任务。CountDownLatch原创 2020-06-18 22:46:01 · 348 阅读 · 0 评论 -
多线程原理
计算机三大核心组件:cpu、内存和输入输出设备(IO)开启多线程的最根本的目的是为了充分利用cpu,提高计算机资源利用率。cpu是发送执行命令的地方,其只能从内存里读取指令来执行,也是线程调度的执行者拿IO来说,在单线程的情况下,假如此时有一个线程需要执行IO,这个过程分2个阶段,1、cpu调度该线程,让该线程执行其要执行的任务;2、该线程执行其IO操作,如果此时的IO需要花费很长时间,那此时的cpu就会处于等待时间,换句话说cpu现在是空闲的,所以在多线程的情况下cpu就可以利用这个空闲时间去调度原创 2020-06-08 17:16:43 · 328 阅读 · 0 评论 -
获取和设置线程的名称
package multiThread;public class ChangeAndGetNameofThread { public static void main(String[] args) { //对于继承Thread 方式设置和获取线程的方法 //方法一:通过构造传参设置线程名称 new Thread("小狗线程"){ @Override public v...原创 2018-04-17 16:08:04 · 900 阅读 · 0 评论 -
单例模式的两种实现方法:饿汉式和懒汉式以及民间懒汉式和登记式
实现一个单例对象的方法分三步:<1>私有化本类的构造方法<2>创建本类对象<3>提供对外公共的访问方法,可以让外类访获取到该单例对象(也就是提供一个 get 方法)例如:package Singleton;public class Singleton_test { public static void main(String[] a...原创 2018-04-19 15:39:10 · 692 阅读 · 0 评论 -
关于java多线程堆和栈的共享问题
在多线程环境下,每个线程拥有一个栈和一个程序计数器。栈和程序计数器用来保存线程的执行历史和线程的执行状态,是线程私有的资源。其他的资源(比如堆、地址空间、全局变量)是由同一个进程内的多个线程共享...原创 2018-07-19 13:40:27 · 3528 阅读 · 1 评论 -
java多线程在单例模式下是否需要同步
最近在阅读 《Inside the JVM》 这本书,结合一些日常工作学习中的感想,随便写一些东西,蜻蜓点水,不必有章法。 关于“单例同步”: 一直有人在问单例对象的并发调用是否需要同步,基本属于“月经帖”了,答案是现成的满天下都是,但真正能让人心里踏实下来的解释寥寥无几。实际上,只要学习了一些JVM的运行原理,解释这个问题就不难了。 如果一个类是单例的,比如某些DAO的设计...转载 2018-07-19 13:55:58 · 668 阅读 · 0 评论 -
从jvm层面来看多线程问题
原文地址,https://www.cnblogs.com/sheeva/p/6366782.html,一直想从jvm角度理解一下多线程,感觉这篇文章分析的很好最近在学习jvm,发现随着对虚拟机底层的了解,对java的多线程也有了全新的认识,原来一个小小的synchronized关键字里别有洞天。决定把自己关于java多线程的所学整理成一篇文章,从最基础的为什么使用多线程,一直深入讲解到jvm底...转载 2018-07-20 10:57:02 · 943 阅读 · 0 评论 -
synchronize与lock的区别
今天看了并发实践这本书的ReentantLock这章,感觉对ReentantLock还是不够熟悉,有许多疑问,所有在网上找了很多文章看了一下,总体说的不够详细,重点和焦点问题没有谈到,但这篇文章相当不错,说的很全面,主要的重点都说到了,所有在这里转载了这篇文章。 在上一篇文章中我们讲到了如何使用关键字synchronized来实现同步访问。本文我们继续来探讨这个问题,从Java 5之后,在j...转载 2018-12-18 15:09:06 · 4439 阅读 · 1 评论 -
Java多线程总结
1、Java应用程序的main函数是一个线程,在jvm启动的时候被调用,线程的名字叫main2、实现一个线程必须创建Thread实例,并重写run方法,调用start方法,不调用start方法相当于还是在main线程内,并没有创建线程3、在jvm启动后实际上有多个线程,但至少有一个非守护线程4、当调用一个线程的start方法的时候,至少有2个线程启动,一个是调用你创建的线程的线程,另一...原创 2019-01-17 10:58:59 · 245 阅读 · 0 评论 -
共享变量在线程间的可见性
https://blog.youkuaiyun.com/osunxu/article/details/78443307一共享变量在线程间的可见性 (1)有关可见性的一些概念介绍 可见性:一个线程对共享变量值的修改,能够及实地被其他线程看到。 共享变量:如果一个变量在多个线程的工作内存中都存在副本,那么这个变量就是这几个线程的共享变量。所有的变量都存...转载 2019-01-09 23:52:33 · 767 阅读 · 0 评论 -
violate原理,java内存模型,可见性,cache二级内存模型
Java中Volatile关键字详解阅读目录一、基本概念 二、Volatile原理一、基本概念先补充一下概念:Java 内存模型中的可见性、原子性和有序性。可见性: 可见性是一种复杂的属性,因为可见性中的错误总是会违背我们的直觉。通常,我们无法确保执行读操作的线程能适时地看到其他线程写入的值,有时甚至是根本不可能的事情。为了确保多个线程之间对内存写入操作的可见性,必须使用...转载 2019-01-26 11:45:06 · 1235 阅读 · 0 评论 -
死锁的产生原因和解决办法
产生死锁的四个必要条件:(1) 互斥条件:一个资源每次只能被一个进程使用。(2) 请求与保持条件:一个进程因请求资源而阻塞时,对已获得的资源保持不放。(3) 不剥夺条件:进程已获得的资源,在末使用完之前,不能强行剥夺。(4) 循环等待条件:若干进程之间形成一种头尾相接的循环等待资源关系。二 锁的分类 锁的类别有两种分法: 1. 从数据库系统的角度来看:分为独占锁(即排它锁),...转载 2019-02-18 20:20:23 · 1217 阅读 · 0 评论 -
什么情况下使用多线程
到底什么时候该用多线程? 我想大多数人在学习多线程时都会对此问题有所顾虑,尽管多线程的概念不难理解,那我们什么时候该用它呢?在大多数情况下,我们写了程序,发现有时必须使用多线程才能得到理想的运行结果,于是我们按照资料调用相关的线程类库或API改善程序,并使其正常运行;但是,到底存不存在一种判断依据,能够明确的指导我们正确地使用多线程机制来解决问题呢?笔者对此进行了一番思考,在此说说我的想...转载 2019-02-26 09:47:05 · 1536 阅读 · 0 评论 -
开启多线程的方法
要开启一个多线程有两种方法:1、继承 Thread 类通过继承 Thread 类的方式实现多线程有4个步骤:<1>create 一个类,让它继承 Thread 类<2>重写 Thread 类里面的 run 方法,把需要执行的代码块放在 run 方法体内<3>在主线程(主程序)内创建该类的对象<4>用该对象调用 start 方法例子:package m...原创 2018-04-17 10:11:35 · 9672 阅读 · 0 评论