[LB-Fox] 并发编程专题
文章平均质量分 77
[LB] 并发编程专题
萧 炎
这个作者很懒,什么都没留下…
展开
-
AQS原理及其ReentrantLock源码分析
1、加锁的本质问大家一个问题,在并发编程中,加锁的本质是什么呢?使得多个线程串行化的访问临界资源。即只能有一个线程去操作临界资源,其他的线程需要进入到阻塞队列中排队等候获取临界资源。 1.1、等待唤醒机制 基于Object的,Object.wait()、Object.notify(),基于monitor机制实现,会释放锁资源;注意,wait,和notify方法 只能在同步代码块中使用,否则会出现异常:java.lang.IllegalMonitorStateException.基于Threa原创 2021-03-28 16:53:41 · 129 阅读 · 0 评论 -
java 查看class markword,JOL工具,ClassLayout,openjdk
Java openjdk 提供jol 工具,可以查看class的头信息。下载 jol 工具包:下载地址选择一个版本,进去后下载 jol-cli-.-full.jar 一定要下载full 的jar导入包。打印:System.out.println(ClassLayout.parseInstance(byte.class).toPrintable());...转载 2021-03-27 11:00:03 · 740 阅读 · 0 评论 -
并发编程之内置锁synchronized底层原理剖析
1、线程与进程进程: 操作系统会以进程为单位,分配系统资源(CPU时间片、内存等资源),进程是资源分配的最小单位。线程: 有时候被称为轻量级进程,是操作系统调度(CPU调度)执行的最小单位,即程序执行的最小单位。如Tomcat是一个进程,其中维护着一些线程,可以处理用户请求。Tomcat这个进程所获得的时间片,其中的线程也可以获得,即线程可以共享进程获得的资源。2、线程上下文切换线程的上下文切换巧妙的利用了时间片轮转的方式,CPU给每个任务都服务一定的时间,然后将当前任务的状态保存下来,在加载下一原创 2021-03-19 22:29:04 · 242 阅读 · 0 评论 -
浅谈CAS以及CAS在java中应用
1、CAS是什么?cas是compareandswap的简称,从字面上理解就是比较并更新,简单来说:从某一内存上取值V,和预期值A进行比较,如果内存值V和预期值A的结果相等,那么我们就把新值B更新到内存,如果不相等,那么就重复上述操作直到成功为止。2、CAS能做什么?上面我们了解了cas是什么了,那么它能解决什么问题呢?它可以解决多线程并发安全的问题,以前我们对一些多线程操作的代码都是使用synchronize关键字,来保证线程安全的问题;现在我们将cas放入到多线程环境里我们看一下它是怎么解决的。转载 2021-03-18 22:42:29 · 448 阅读 · 0 评论 -
Java-线程池ThreadPoolExecutor之invokeAll()源码解读
平时工作中因为用到ExecutorService的频率略多,而在这之中invokeAll方法又是常用方法,因此这里详细解读下invokeAll方法。首先贴上源代码:public <T> List<Future<T>> invokeAll(Collection<? extends Callable<T>> tasks) throws InterruptedException { if (tasks == null)转载 2021-03-16 20:09:01 · 3437 阅读 · 3 评论 -
SpringBoot线程池的创建、@Async配置步骤及注意事项
最近在做订单模块,用户购买服务类产品之后,需要进行预约,预约成功之后分别给商家和用户发送提醒短信。考虑发短信耗时的情况所以我想用异步的方法去执行,于是就在网上看见了Spring的@Async了。但是遇到了许多问题,使得@Async无效,也一直没有找到很好的文章去详细的说明@Async的正确及错误的使用方法及需要注意的地方,这里简单整理了一下遇见的问题,Spring是以配置文件的形式来开启@Async,而SpringBoot则是以注解的方式开启。ps:线程池配合定时任务效果绝佳:基于springBoot的转载 2021-03-16 09:05:31 · 547 阅读 · 0 评论 -
Java线程池shutdown()、awaitTermination() 、shutdownNow() 方法的使用
1、shutdown() 方法的使用public class ShutdownTest { public static void main(String[] args) throws InterruptedException { ExecutorService service = Executors.newFixedThreadPool(2); for (int i = 0; i < 5; i++) { // lambda表达式...转载 2021-03-15 20:57:29 · 1133 阅读 · 0 评论 -
线程池时候当程序结束时候记得调用shutdown关闭线程池
一、使用线程池时候当程序结束时候记得调用shutdown关闭线程池日常开发中为了便于线程的有效复用,线程池是经常会被用的工具,然而线程池使用完后如果不调用shutdown会导致线程池资源一直不会被释放。下面通过简单例子来说明该问题。1、问题复现下面通过一个例子说明当不调用线程池对象的shutdown方法后,当线程池里面的任务执行完毕后主线程这个JVM不会退出。public class TestShutDown { static void asynExecuteOne() {转载 2021-03-15 20:03:21 · 2025 阅读 · 0 评论 -
Java线程池ThreadPoolExcutor任务分配、执行顺序
一、任务分配顺序1、顺序核心线程 队列 非核心线程。2、源码public void execute(Runnable command) { if (command == null) throw new NullPointerException(); /* * Proceed in 3 steps: * * 1. If fewer than corePoolSize threads原创 2021-03-14 15:49:22 · 2626 阅读 · 0 评论 -
Java并发ThreadPoolExecutor原理源码详解
一、ThreadPoolExcutors的作用java提供了ThreadPoolExcutors来创建一个线程池,我们为什么要用线程池呢?1.降低资源的消耗:通过重复利用已经创建好的线程降低线程的创建和销毁带来的损耗2.提高响应速度:因为线程池中的线程处于等待分配任务的状态,当任务来时无需创建新的线程就能执行3.提高线程的可管理性二、ThreadPoolExecutor构造函数参数详细介绍public ThreadPoolExecutor(int corePoolSize,转载 2021-03-14 15:10:27 · 139 阅读 · 0 评论 -
synchronized能不能保证有序性
肯定能啊。但是:比如单例模式里面的双检锁dcl,为什么还要加volatile禁止指令重排序呢??class Singleton{ private static Singleton instance; private Singleton(){} public static Singleton getInstance(){ if(instance==null){ synchronized (Singleton.class){转载 2021-03-14 09:19:08 · 1821 阅读 · 0 评论 -
深入解析volatile关键字
转载地址:https://www.cnblogs.com/dolphin0520/p/3920373.html1、计算机计算过程2、并发编程的三要素3、深入解析volatile关键字4、volatile运用场景1234计算机计算过程大家都知道,计算机在执行程序时,每条指令都是在CPU中执行的,而执行指令过程中,势必涉及到数据的读取和写入。由于程序运行过程中的临时数据是存放在主存(物理内存)当中的,这时就存在一个问题,由于CPU执行速度很快,而从内存读取数据和向内存写入数据的过程跟CPU执行指转载 2021-03-14 09:12:09 · 134 阅读 · 0 评论 -
Java volatile关键字
一、简介volatile是Java提供的一种轻量级的同步机制。Java 语言包含两种内在的同步机制:同步块(或方法)和 volatile 变量,相比于synchronized(synchronized通常称为重量级锁),volatile更轻量级,因为它不会引起线程上下文的切换和调度。但是volatile 变量的同步性较差(有时它更简单并且开销更低),而且其使用也更容易出错。二、并发编程的3个基本概念1.原子性 定义: 即一个操作或者多个操作 要么全部执行并且执行的过程不会被任何因素打断,要转载 2021-03-13 21:45:42 · 70 阅读 · 0 评论 -
as-if-serial和happens-before
as-if-serialas-if-serial语义的意思是:不管怎么重排序(编译器和处理器为了提高并行度),(单线程)程序的执行结果不能被改变。编译器、runtime和处理器都必须遵守as-if-serial语义。 为了遵守as-if-serial语义,编译器和处理器不会对存在数据依赖关系的操作做重排序,因为这种重排序会改变执行结果。但是,如果操作之间不存在数据依赖关系,这些操作就可能被编译器和处理器重排序。 double pi = 3.14; // Adouble r = 1.0; ..转载 2021-03-13 21:15:37 · 196 阅读 · 0 评论 -
内存屏障
硬件层提供了一系列的内存屏障 memory barrier / memory fence(Intel的提法)来提供一致性的能力。拿X86平台来说,有几种主要的内存屏障:lfence,是一种Load Barrier 读屏障sfence, 是一种Store Barrier 写屏障mfence, 是一种全能型的屏障,具备lfence和sfence的能力Lock前缀,Lock不是一种内存屏障,但是它能完成类似内存屏障的功能。Lock会对CPU总线和高速缓存加锁,可以理解为CPU指令级的一种锁。它后面可以跟原创 2021-03-13 21:12:55 · 157 阅读 · 0 评论 -
The JSR-133 Cookbook for Compiler Writers
by Doug Lea, with help from members of the JMM mailing list.dl@cs.oswego.edu.Preface: Over the 10+ years since this was initially written, many processor and language memory model specifications and issues have become clearer and better understood. And原创 2021-03-13 20:06:55 · 343 阅读 · 0 评论 -
并发编程基础
并发编程基础概念计算机组成原理现代计算机硬件原理图冯·诺依曼计算机的特点计算机由运算器、存储器、控制器、输入设备和输出设备五大部件组成指令(程序)和数据以二进制不加区别地存储在存储器中程序自动运行运算器和控制器封装到一起,加上寄存器组和cpu内部总线构成中央处理器(CPU)。cpu的根本任务,就是执行指令,对计算机来说,都是0,1组成的序列,cpu从逻辑上可以划分为3个模块:控制单元、运算单元和存储单元。这三个部分由cpu总线连接起来。cpu原理图CPU的运行原理就是:控制单元在时转载 2021-03-13 18:13:25 · 223 阅读 · 0 评论