![](https://img-blog.csdnimg.cn/20201014180756930.png?x-oss-process=image/resize,m_fixed,h_64,w_64)
多线程
文章平均质量分 89
养歌
任何傻瓜都能写出计算机可以理解的代码,好的程序员能写出人能读懂的代码。
展开
-
内存溢出+CPU占用过高排查解决方案
前言这段时间以来都没有写过文章了,以为要换工作的原因,所以一直在为面试做准备,面试了几家收到了4个offer,连我也不知道什么时候这么抢手了,后来选择了一家做医疗的大公司工作,废话不多说,今天开始陆续写文章。这里不说其他的,只说内存的溢出以及怎么排查,这也是面试会被面试官问到的问题。以下的方式适合初学者。定位问题top命令查看最耗CPU的进程这里输入top 命令之后键入大写的 P ,进程按照 CPU 从高到底排序。查看最消耗 CPU 的线程,比如一下这个进程:1612 为进程号,键入大写原创 2022-03-15 10:06:48 · 1312 阅读 · 0 评论 -
深入分析 Synchronized 原理
Synchronized 简介Synchronized 是 Java 中的关键字,是一种同步锁。在多线程编程中,有可能会出现多个线程同时争抢同一个共享资源的情况,这个资源一般被称为临界资源。这种共享资源可以被多个线程同时访问,且又可以同时被多个线程修改,然而线程的执行是需要 CPU 的资源调度,其过程是不可控的,所以需要采用一种同步机制来控制对共享资源的访问,于是线程同步锁—— Synchronized 就应运而生了。Synchronized 用法Synchronized 关键字主要有以下 3 种使用原创 2022-02-07 11:42:56 · 2127 阅读 · 0 评论 -
搞懂 Runnable、Future、Callable、FutureTask 之间的关系,这篇就够了
前言创建线程的两种方式主要有继承 Thread 类 或 实现 Runnable 接口,重写 run 方法,无论我们使用 Thread 还是 Runnable 新建线程,它都无法返回结果值。自从 Jdk1.5 开始,官方提供了 Callable 和 Future, 通过他们就可以获得任务的执行结果。其中 FutureTask 则作为 Future 的实现类。下面是他们的关系类图:RunnableThread 类本身也实现了 Runnable 接口,Runnable 接口源码如下:public in原创 2022-01-27 17:10:02 · 4528 阅读 · 0 评论 -
Java 线程的 6 种状态及转化
前言线程是 JVM 执行任务的最小单元,理解线程的状态转换是理解后续多线程问题的基础。当我们说一个线程的状态时,其实说的就是一个变量的值,在 Thread 类中的一个变量,叫 private volatile int threadStatus = 0;这个值是个整数,不方便理解,可以通过映射关系(VM.toThreadState),转换成一个枚举类。public enum State { NEW, RUNNABLE, BLOCKED, WAITING, TIMED_WAITING, TE原创 2022-01-25 18:13:13 · 3965 阅读 · 0 评论 -
正在运行的线程池,如何动态修改核心线程数?
下面我们来了解线程池的核心参数都有哪些?corePoolSize:表示核心线程池的大小。当提交一个任务时,如果当前核心线程池的线程个数没有达到 corePoolSize,则会创建新的线程来执行所提交的任务,即使当前核心线程池有空闲的线程。如果当前核心线程池的线程个数已经达到了 corePoolSize,则不再重新创建线程。如果调用了prestartCoreThread()或者 prestartAllCoreThreads(),线程池创建的时候所有的核心线程都会被创建并且启动。maximumPoolS原创 2022-01-14 14:25:51 · 5547 阅读 · 0 评论 -
面试官:如何让主线程等待所有的子线程执行结束之后再执行
java 主线程等待所有子线程执行完毕在执行,在工作总往往会遇到异步去执行某段逻辑, 然后先处理其他事情, 处理完后再把那段逻辑的处理结果进行汇总(比如用户下单一个产品,后台会做一系列的处理,为了提高效率,每个处理都可以用一个线程来执行,所有处理完成了之后才会返回给用户下单成功)的场景, 这时候就需要使用线程了。解决方法sleep用 sleep 方法,让主线程睡眠一段时间,让其它子线程先执行,虽然也是解决的方法,但是不推荐使用。public class ThreadTest extends Thre原创 2022-01-12 13:50:07 · 4761 阅读 · 0 评论 -
面试官:如何停止一个正在运行的线程
停止一个线程意味着在任务处理完任务之前停掉正在做的操作,也就是放弃当前的操作。停止一个线程可以用Thread.stop() 方法。使用 stop 方法中止线程public class ThreadTest{ static class Thread1 extends Thread { @Override public void run() { for (int i = 0; i < 500000; i++) {原创 2022-01-12 09:57:18 · 3528 阅读 · 1 评论 -
详述Java线程池实现原理
线程池是什么线程池就是创建若干个可执行的线程放入一个池(容器)中,有任务需要处理时,会提交到线程池中的任务队列,处理完之后线程并不会被销毁,而是仍然在线程池中等待下一个任务。使用线程池有什么好处降低资源消耗:通过重复利用现有的线程来执行任务,避免多次创建和销毁线程提高响应速度:因为省去了创建线程这个步骤,所以在拿到任务时,可以立刻开始执行提供附加功能:线程池的可拓展性使得我们可以自己加入新的功能,比如说定时、延时来执行某些线程提高线程的可管理性:线程是稀缺资源,如果无限制的创建,不仅会消耗系统原创 2022-01-06 11:52:47 · 2602 阅读 · 0 评论 -
详述重入锁-ReentrantLock
什么是重入锁?锁主要用来控制多线程访问的行为,对于同一个线程,如果连续两次对同一把锁进行lock,那么这个线程会被卡死在那里,这样的特性很不好,在实际的开发中,方法之间的调用方式错综复杂,如果不小心可能在多个不同的方法中,反复调用 lock(),这样就会把自己卡死。所以,重入锁就是用来解决这个问题的,重入锁使同一个线程可以对同一把锁在不释放的前提下,反复的加锁不会导致线程的卡死,唯一的一点就是需要保证 unlock() 的次数和 lock()一样的多。重入锁的实现Java中的锁都来自与 Lock原创 2021-12-27 17:17:28 · 3541 阅读 · 1 评论 -
Linux环境多线程报错Caused by: java.lang.OutOfMemoryError: GC overhead limit exceeded原因解决以及分析
今天线上的项目停止服务,导致用户登录不上,上次也导致了服务停止,没有把重心放在上面,今天又出现了这个问题才一直在找问题,查看日志定位到发生问题的地方,发现出现了java.lang.OutOfMemoryError: GC overhead limit exceeded错误。那么这种原因是怎么来的?这个oracle官方已经给出了这个错误产生的原因和解决方法:翻译过来的意思是:线程名称中的异常:java。lang.OutOfMemoryError:超出GC开销限制原因:详细消息“超出 GC 开销限制原创 2021-12-23 09:14:17 · 15372 阅读 · 0 评论 -
什么是乐观锁、悲观锁
在介绍悲观锁和乐观锁之前,我们先看一下什么是锁。锁生活中:锁在我们身边无处不在,比如我出门玩去了需要把门锁上,比如我需要把钱放到保险柜里面,必须上锁以保证我财产的安全。代码中:比如多个线程需要同时操作修改共享变量,这时需要给变量上把锁(syncronized),保证变量值是对的。数据库表:当多个用户修改表中同一数据时,我们可以给该行数据上锁(行锁)。悲观锁(悲观并发控制)当我们要对数据库中的一条数据进行修改的时候,为了避免同时被其他人修改,最好的办法就是直接对该数据进行加锁以防止并发的发生。为原创 2021-12-23 15:01:01 · 21121 阅读 · 8 评论 -
面试官:讲讲互斥锁、自旋锁吧
在介绍悲观锁和乐观锁之前,我们先看一下什么是锁。锁生活中:锁在我们身边无处不在,比如我出门玩去了需要把门锁上,比如我需要把钱放到保险柜里面,必须上锁以保证我财产的安全。如何用好锁是程序员的基本素养之一。多线程访问共享资源的时候,避免不了资源竞争而导致数据错乱的问题,通常为了解决这一问题,都会在访问共享资源之前加锁。最常用的就是互斥锁,当然还有很多种不同的锁,比如自旋锁、读写锁、乐观锁等,不同种类的锁自然适用于不同的场景。如果选对了合适的锁,则会大大提高系统的性能如果选择了错误的锁,在一些高并发的场原创 2021-12-24 11:09:08 · 1478 阅读 · 0 评论 -
volatile底层实现原理详解
小伙伴都知道可以使用 volatile 达到保证可见性和指令重排的目的,对他的认知很多小伙伴也仅限于会用阶段,但是对其实现原理并不是很清楚,为了加深学习和理解今天写了这篇总结一下。下面我们来段代码看一下: final static int MAX = 50; static int value = 0; public static void main(String[] args) { //读数据线程 new Thread(()->{原创 2021-12-24 14:40:14 · 1340 阅读 · 2 评论 -
JUC下的CountDownLatch,CyclicBarrier、Semaphore的使用方法
countDownLatch是在 java1.5 被引入,跟它一起被引入的工具类还有 CyclicBarrier、Semaphore、concurrentHashMap 和 BlockingQueue,它们存在于java.util.cucurrent包下,这里我们只会说到countDownLatch、CyclicBarrier、Semaphore这三种。什么是CountDownLatch意思是 CountDownLatch 是一个同步辅助器,允许一个或多个线程一直等待,直到一组在其他线程执行的操作全部完原创 2021-12-22 11:34:51 · 719 阅读 · 0 评论 -
CountDownLatch,CyclicBarrier,Semaphore的使用方法以及它们之间的区别
在 JUC 下包含了一些常用的同步工具类,今天就来详细介绍一下,CountDownLatch,CyclicBarrier,Semaphore 的使用方法以及它们之间的区别。一、CountDownLatch先看一下,CountDownLatch 源码的官方介绍。图片意思是,它是一个同步辅助器,允许一个或多个线程一直等待,直到一组在其他线程执行的操作全部完成。public CountDownLatch(int count) { if (count < 0) throw new IllegalA转载 2021-03-23 13:45:28 · 172 阅读 · 0 评论