并发编程
文章平均质量分 70
拨云见日yab
这个作者很懒,什么都没留下…
展开
-
ThreadPoolExecutor:线程池不允许使用Executors创建
合理利用线程池能够带来三个好处第一:降低资源消耗。通过重复利用已创建的线程降低线程创建和销毁造成的消耗。 第二:提高响应速度。当任务到达时,任务可以不需要的等到线程创建就能立即执行。 第三:提高线程的可管理性。线程是稀缺资源,如果无限制的创建,不仅会消耗系统资源,还会降低系统的稳定性,使用线程池可以进行统一的分配,调优和监控。但是要做到合理的利用线程池,必须对其原理了如指掌线程池的主要工作流程从上图我们可以看出,当提交一个新任务到线程池时,线程池的处理流程如下:首先线程池判断基本线程池.原创 2021-12-03 15:30:39 · 216 阅读 · 0 评论 -
什么是Java内存模型?
内容有点长,请花十分钟认真读,你会收获很多。快读在内存里,Java内存模型规定了所有的变量都存储在主内存(物理内存)中,每条线程还有自己的工作内存,线程对变量的所有操作都必须在工作内存中进行。不同的线程无法访问其他线程的工作内存里的内容。我们可以使用下图来表示在逻辑上 线程、主内存、工作内存的三者交互关系。现在,我们都理解了缓存导致了可见性问题,编译优化导致了有序性问题。也就是说解决可见性和有序性问题的最直接的办法就是禁用缓存和编译优化。但是,如果只是简单的禁用了缓存和编译优化,那我们..原创 2021-12-03 15:23:52 · 750 阅读 · 3 评论 -
JVM堆内存溢出后,其他线程是否可继续工作?
最近网上出现一个美团面试题:“一个线程OOM后,其他线程还能运行吗?”我看网上出现了很多不靠谱的答案。这道题其实很有难度,涉及的知识点有jvm内存分配、作用域、gc等,不是简单的是与否的问题。由于题目中给出的OOM,java中OOM又分很多类型;比如:堆溢出(“java.lang.OutOfMemoryError: Java heap space”)、永久带溢出(“java.lang.OutOfMemoryError:Permgen space”)、不能创建线程(“java.lang.转载 2021-12-01 08:58:15 · 578 阅读 · 0 评论 -
高并发环境下如何优化Tomcat配置?
Tomcat作为最常用的Java Web服务器,随着并发量越来越高,Tomcat的性能会急剧下降,那有没有什么方法来优化Tomcat在高并发环境下的性能呢?Tomcat运行模式Tomcat的运行模式有3种。1.bio模式默认的模式,性能非常低下,没有经过任何优化处理和支持。2.nio模式利用java的异步io护理技术,noblocking IO技术。要想运行在该模式下,则直接修改server.xml里的Connector节点,修改protocol为如下配置。protocol="o.原创 2021-11-28 22:15:57 · 216 阅读 · 0 评论 -
死磕并发编程第十六篇
大家好,我是拨云见日yab,以下内容来自于《深入理解并发编程》。把书中精彩的内容记下来,记录下学习的过程。ThreadLocal学会了这些,你也能和面试官扯皮了!前言我们都知道,在多线程环境下访问同一个共享变量,可能会出现线程安全的问题,为了保证线程安全,我们往往会在访问这个共享变量的时候加锁,以达到同步的效果,如下图所示。对共享变量加锁虽然能够保证线程的安全,但是却增加了开发人员对锁的使用技能,如果锁使用不当,则会导致死锁的问题。而ThreadLocal能够做到在创建变量后,每个...原创 2021-11-27 11:20:43 · 84 阅读 · 0 评论 -
死磕并发编程第十五篇
大家好,我是拨云见日yab,以下内容来自于《深入理解并发编程》。把书中精彩的内容记下来,记录下学习的过程。AQS中的ReentrantLock、ReentrantReadWriteLock、StampedLock与ConditionReentrantLock概述Java中主要分为两类锁,一类是synchronized修饰的锁,另外一类就是J.U.C中提供的锁。J.U.C中提供的核心锁就是ReentrantLock。ReentrantLock(可重入锁)与synchronized区别:..原创 2021-11-27 10:54:25 · 94 阅读 · 0 评论 -
死磕并发编程第十四篇
大家好,我是拨云见日yab,以下内容来自于《深入理解并发编程》。把书中精彩的内容记下来,记录下学习的过程。温故而知新AQS中的CountDownLatch、Semaphore与CyclicBarrierCountDownLatch概述同步辅助类,通过它可以阻塞当前线程。也就是说,能够实现一个线程或者多个线程一直等待,直到其他线程执行的操作完成。使用一个给定的计数器进行初始化,该计数器的操作是原子操作,即同时只能有一个线程操作该计数器。调用该类await()方法的线程会一直阻塞,...原创 2021-11-27 10:33:12 · 82 阅读 · 0 评论 -
死磕并发编程第十三篇
大家好,我是拨云见日yab,以下内容来自于《深入理解并发编程》。把书中精彩的内容记下来,记录下学习的过程。人生就像骑单车,想保持平衡就得往前走深入理解Thread类源码本文是基于JDK 1.8来进行分析的。Thread类的继承关系我们可以使用下图来表示Thread类的继承关系。由上图我们可以看出,Thread类实现了Runnable接口,而Runnable在JDK 1.8中被@FunctionalInterface注解标记为函数式接口,Runnable接口在JDK 1.8中...原创 2021-11-27 10:10:58 · 102 阅读 · 0 评论 -
死磕并发编程第十二篇
大家好,我是拨云见日yab,以下内容来自于《深入理解并发编程》。把书中精彩的内容记下来,记录下学习的过程。行百里者半九十,坚持就会胜利。深度解析ScheduledThreadPoolExecutor类的源代码ScheduledThreadPoolExecutor类是ThreadPoolExecutor类的子类。今天我们就来一起手撕ScheduledThreadPoolExecutor类的源代码。构造方法我们先来看下ScheduledThreadPoolExecutor的构造方法,源..原创 2021-11-27 00:56:42 · 231 阅读 · 0 评论 -
死磕并发编程第十一篇
大家好,我是拨云见日yab,以下内容来自于《深入理解并发编程》。把书中精彩的内容记下来,记录下学习的过程。重复是学习之母从源码角度深度解析线程池是如何实现优雅退出的本文,我们就来从源码角度深度解析线程池是如何优雅的退出程序的。首先,我们来看下ThreadPoolExecutor类中的shutdown()方法。shutdown()方法当使用线程池的时候,调用了shutdown()方法后,线程池就不会再接受新的执行任务了。但是在调用shutdown()方法之前放入任务队列中的任务还是要..原创 2021-11-22 22:06:45 · 80 阅读 · 0 评论 -
死磕并发编程第十篇
大家好,我是拨云见日yab,以下内容来自于《深入理解并发编程》。把书中精彩的内容记下来,记录下学习的过程。原创 2021-11-21 17:10:27 · 163 阅读 · 0 评论 -
死磕并发编程第九篇
大家好,我是拨云见日yab,以下内容来自于《深入理解并发编程》。把书中精彩的内容记下来,记录下学习的过程。原创 2021-11-21 17:08:52 · 71 阅读 · 0 评论 -
死磕并发编程第八篇
大家好,我是拨云见日yab,以下内容来自于《深入理解并发编程》。把书中精彩的内容记下来,记录下学习的过程。原创 2021-11-21 17:08:34 · 164 阅读 · 0 评论 -
死磕并发编程第七篇
大家好,我是拨云见日yab,以下内容来自于《深入理解并发编程》。把书中精彩的内容记下来,记录下学习的过程。原创 2021-11-21 17:08:08 · 66 阅读 · 0 评论 -
死磕并发编程第六篇
大家好,我是拨云见日yab,以下内容来自于《深入理解并发编程》。把书中精彩的内容记下来,记录下学习的过程。原创 2021-11-21 17:01:51 · 92 阅读 · 0 评论 -
死磕并发编程第五篇
大家好,我是拨云见日yab,以下内容来自于《深入理解并发编程》。把书中精彩的内容记下来,记录下学习的过程。原创 2021-11-20 22:26:32 · 90 阅读 · 0 评论 -
死磕并发编程第四篇
大家好,我是拨云见日yab,以下内容来自于《深入理解并发编程》。把书中精彩的内容记下来,记录下学习的过程。原创 2021-11-20 22:03:52 · 73 阅读 · 0 评论 -
死磕并发编程第三篇
大家好,我是拨云见日yab,以下内容来自于《深入理解并发编程》。把书中精彩的内容记下来,记录下学习的过程。原创 2021-11-20 17:39:27 · 213 阅读 · 0 评论 -
死磕并发编程第二篇
大家好,我是拨云见日yab,以下内容来自于《深入理解并发编程》。把书中精彩的内容记下来,记录下学习的过程。原创 2021-11-20 17:19:23 · 199 阅读 · 0 评论 -
死磕并发编程第一篇
大家好,我是拨云见日yab,以下内容来自于《深入理解并发编程》。把书中精彩的内容记下来,记录下学习的过程。原创 2021-11-20 16:25:45 · 73 阅读 · 0 评论 -
每日打卡--day11
violatile 关键字的作用?一个非常重要的问题,是每个学习、应用多线程的 Java 程序员都必须掌握的。理 解 volatile关键字的作用的前提是要理解 Java 内存模型,这里就不讲 Java 内存模型 了,可以参见第31 点,volatile 关键字的作用主要有两个:1)多线程主要围绕可见性和原子性两个特性而展开,使用 volatile 关键字修饰的变 量,保证了其在多线程之间的可见性,即每次读取到 volatile 变量,一定是最新的数据。2)代码底层执行不像我们看到的高级语言--原创 2021-11-09 21:17:01 · 252 阅读 · 0 评论 -
每日打卡--day10
线程中的 wait()和 sleep()方法有什么区别?sleep 方法和 wait 方法都可以用来放弃 CPU 一定的时间,不同点在于如果线程持有某个对象的监视器,sleep 方法不会放弃这个对象的监视器,wait 方法会放弃这个对象的监视器。...原创 2021-11-09 21:15:16 · 80 阅读 · 0 评论 -
每日打卡--day09
一个线程的生命周期有哪几种状态?它们之间如何流转的?六种状态:NEW:毫无疑问表示的是刚创建的线程,还没有开始启动。RUNNABLE: 表示线程已经触发 start()方式调用,线程正式启动,线程处于运行中 状态。BLOCKED:表示线程阻塞,等待获取锁,如碰到 synchronized、lock 等关键字等占用临界区的情况,一旦获取到锁就进行 RUNNABLE 状态继续运行。WAITING:表示线程处于无限制等待状态,等待一个特殊的事件来重新唤醒,如 通过wait()方法进行等待的原创 2021-11-09 21:14:21 · 79 阅读 · 0 评论 -
每日打卡--day08
启动线程方法 start()和 run()有什么区别?只有调用了 start()方法,才会表现出多线程的特性,不同线程的 run()方法里面的代码交替执行。如果只是调用 run()方法,那么代码还是同步执行的,必须等待一个线程的 run()方法里面的代码全部执行完毕之后,另外一个线程才可以执行其 run() 方法里面的代码。...原创 2021-11-09 21:12:30 · 87 阅读 · 0 评论 -
每日打卡--day07
Java 实现线程有哪几种方式?(1)继承 Thread 类实现多线程(2)实现 Runnable 接口方式实现多线程(3)使用 ExecutorService、Callable、Future 实现有返回结果的多线程(4)通过线程池创建线程原创 2021-11-09 21:11:18 · 228 阅读 · 0 评论 -
并发编程02--可见性和有序性
缓存一致性问题原创 2021-11-07 17:47:15 · 85 阅读 · 0 评论 -
并发编程01--同步锁
原子性 Synchronized, AtomicXXX、Lock、可见性 Synchronized, volatile有序性 Synchronized,volatile原子性问题在下面的案例中,演示了两个线程分别去去调用 demo.incr 方法来对 i 这个变量进行叠加,预期结果应该是20000,但是实际结果却是小于等于20000的值package com.yang.demo;/** * @ClassName: Test * @Description: * @Autho..原创 2021-11-03 17:12:11 · 145 阅读 · 1 评论