高并发系列
文章平均质量分 74
难啃的骨头,比较枯燥但是很有用。概念精简提炼版本
青瓜与孤独
分享的不仅是知识,更是快乐!
展开
-
JUC中的原子类操作
JUC中原子类的操作文章目录JUC中原子类的操作前言一、简图二、基本类型原子类三、数组类型的原子类四、引用类型的原子操作类五、对象属性修改的原子类操作前言atomic译为原子,原子在化学中中表示物质最小的单位是不可分割。而在多线程中原子类(具有原子操作特性的类)中的操作是不可中断的。即时在多线程的情况下原子操作一旦开始不会受到其它线程的干扰。一、简图atomic中原子操作类简图atomic原子操作得益于:JMM volatile UnSafe CAS机制二、基本类型原子类Atomic原创 2021-04-12 16:43:08 · 197 阅读 · 0 评论 -
Executors一篇就够
Executors框架包含的内容十分的多:看图:Executors框架前言一、pandas是什么?二、使用步骤1.引入库2.读入数据总结前言提示:这里可以添加本文要记录的大概内容:例如:随着人工智能的不断发展,机器学习这门技术也越来越重要,很多人都开启了学习机器学习,本文就介绍了机器学习的基础内容。提示:以下是本篇文章正文内容,下面案例可供参考一、pandas是什么?示例:pandas 是基于NumPy 的一种工具,该工具是为了解决数据分析任务而创建的。二、使用步骤1.引入库代码原创 2021-04-11 16:05:37 · 4570 阅读 · 0 评论 -
ScheduledThreadPoolExecutor类的使用
系列文章目录关系图:文章目录系列文章目录前言0.熟悉api1.schedule方法2.固定频率执行任务3.固定的间隔时间执行任务4.定时任务出现异常5.取消定时任务的执行前言ScheduledThreadPoolExecutor它与ThreadPoolExecutor最大的不同就是可以设置延迟任务和中期任务。0.熟悉api构造方法:ScheduledThreadPoolExecutor(int corePoolSize) 指定核心线程大小,最大线程数默认为Integ原创 2021-04-11 14:57:04 · 2645 阅读 · 0 评论 -
线程池深入浅出也就这一篇了!
线程池深入浅出线程池在高并发编程中是一定会使用到的!接下来一起看看吧文章目录线程池深入浅出一、什么是线程池?二、线程池原理三、线程池的核心api四、常见的工作队列五、自定义线程工厂六、常见的饱和策略七、线程池的关闭八、线程池的拓展一、什么是线程池?线程池从名字上来看就是存放线程的池子,那为什么需要它?或者它有什么优势?线程的创建和销毁是一件非常消耗资源的操作。有时我们实际的业务还没有线程的创建开销大,线程池的作用便是提前创建好一些线程,我们需要的时候直接来取,使用完毕后不是关闭,而原创 2021-04-10 21:57:59 · 105 阅读 · 0 评论 -
CyclicBarrier的使用
CyclicBarrier称为循环屏障它允许一组线程互相等待,直到达到某个公共的屏障点CyclicBarrier和CountDownLatch有一些相似。CountDownLatch表示只有线程执行结束后当前线程才可以继续执行和Join方法一致。但是CyclicBarrier是只有等待的线程数达到一定的值时才继续执行。该值在我们创建对象的时候传递CyclicBarrier的计数器可以重置,因此他的实例可以反复使用public CyclicBarrier(int parties);在给定数量的线原创 2021-04-10 16:05:26 · 230 阅读 · 0 评论 -
Semaphore信号量真的晦涩难懂?
在介绍Semaphore信号量的时候我们要知道以往学习的synchronized和ReentrantLock锁都是只允许在同一时刻只能有一个线程去访问资源。这与我们生活中的一些情况是不符合的。而Semaphore信号量可以控制多个线程去访问特定的资源。Semaphore的使用场景:理解:假设有一个停车场,一次可以停车5辆。而停车管理员就好比我们的Semaphore他可以控制需要停车的车辆。每一个停车位都有一把锁,当来了一辆车后就给该车主一把钥匙,在停车结束后就车主将车钥匙归还给管理员。如果管理员此时原创 2021-04-10 11:24:18 · 112 阅读 · 0 评论 -
LockSupport实现等待唤醒机制
提到等待唤醒机制最常想到的就是Object中的wait/notify以及Condition中await/signal。但是这两种方式会有一定的缺陷比如:1.在使用等待唤醒机制前需要先获取锁2.等待一定是发生在唤醒之前的那么今天介绍的LockSupport在实现等待唤醒机制时就不需要获取锁LockSupport实现等待唤醒机制依靠的是park()和unpark(thread)方法,这两个方法都是LockSupport的静态方法每一个线程都会有一个许可证称为permit。permit只有两个值原创 2021-04-10 09:23:04 · 149 阅读 · 1 评论 -
多线程中Condition的用法
多线程中Condition的用法与Object中wait、notify、notifyAll用法非常的相似Condition与Lock对象搭配完成等待唤醒机制首先我们需要创建Condition对象newCondition();//返回Condition实例首先我们知道wait、notify使用前提是通过synchronized获取锁对象,而Condition对象也需要在使用前获取锁。此时获取锁是通过Lock的lock()方法获取锁。Condition能够支持不响应中断,而通过使用Object方式原创 2021-04-09 22:12:30 · 940 阅读 · 0 评论 -
ReentrantLock锁详解
在没有接触ReentrantLock锁之前我们一直使用的是Synchronized互斥锁。Synchronized是Java的一个关键字,锁是由Jvm实现的,因此我们在使用的时候相对比较方便(无需考虑释放锁),但是synchronized相对于我们今天介绍的ReentrantLock有以下的局限性:1.当线程尝试获取锁的时候,若不能成功获取锁便会一直阻塞且用户无法控制2.如果获取锁的线程休眠或者阻塞了,若不发生异常则将导致需要该锁的线程一直等待下去了解ReentrantLock锁前了解一些概念1.原创 2021-04-09 19:19:36 · 926 阅读 · 0 评论 -
线程安全的实现方法
首先线程安全的实现方法多是理论,比较枯燥!首先知道什么是线程安全?“线程安全”是一个老生常谈的话题,但是对线程安全比较规范的定义却不是一件容易的事。Brian Goetz是这样描述线程安全的:当多个线程同时访问同一个对象时,如果不用考虑这些线程在运行时环境下的调度和交替执行,也不需要额外的同步,或者在调用方法进行其它的协调操作,调用这个对象的行为都可以获得正确的结果,那么就称这个对象是安全的。简单说:但多个线程同时访问同一个类(对象、方法)的时候,可以得到预期的结果,那么这就是线程安全的。线原创 2021-04-09 10:54:31 · 695 阅读 · 0 评论 -
synchronized关键字
“线程安全”是一个老生常谈的话题,但是对线程安全比较规范的定义却不是一件容易的事。Brian Goetz是这样描述线程安全的:当多个线程同时访问同一个对象时,如果不用考虑这些线程在运行时环境下的调度和交替执行,也不需要额外的同步,或者在调用方法进行其它的协调操作,调用这个对象的行为都可以获得正确的结果,那么就称这个对象是安全的。简单说:但多个线程同时访问同一个类(对象、方法)的时候,可以得到预期的结果,那么这就是线程安全的。看一段代码:public class Xiaoping {原创 2021-04-08 21:56:17 · 56 阅读 · 0 评论 -
线程组的使用
首先什么是线程组?线程组表示一个线程的集合,还可以包含其它线程组。像一棵树我们首先看一下线程组怎么创建ThreadGroup(String name) //构造一个新线程组。 //name表示线程组的名字,此时如果不指定父线程组的话就是main线程组,main线程组的父线程组是System线程组ThreadGroup(ThreadGroup parent, String name) //创建一个新线程组。 //创建一个新的线程组并且加入指定的线程组中。演示验证:上述演示中用到的方原创 2021-03-23 23:13:47 · 177 阅读 · 0 评论 -
用户线程和守护线程
什么是用户线程?什么又是守护线程?从名字上来看用户线程就是我们用户定义的线程,系统的工作线程用于完成一定的业务逻辑。而守护线程从名字上看我们可以理解为守护线程就是守护用户线程的比如我们常见的垃圾收集线程。守护线程在系统后台默默的提供着服务,一旦用户线程结束,那么Java虚拟机将会自动退出举栗子:public class Test extends Thread { @Override public void run() { System.out.println(this.isDaemon(原创 2021-03-23 20:58:11 · 249 阅读 · 0 评论 -
volatile关键字深入浅出
volatile关键字volatile关键字提供最轻量级的同步机制,但是想完全正确的理解该关键字你需要知道的东西有很多。比如先行并发原则、指令重排序以及最重要的JMM。下面一起来看看吧。前言一、看一下这段代码?public class Test extends Thread { //定义一个变量来控制循环结束 static boolean falg =true; @Override public void run() { System.out.println("该线原创 2021-03-23 19:47:15 · 100 阅读 · 0 评论 -
线程中断的方式
线程中断的方式我在这篇文章多线程基本操作有解释过。这篇文章单独抽离出来共享变量的方式public class MyThread implements Runnable { //使用volatile关键字可以做到变量的可见性,后续会详细的解释 static volatile boolean flag = false; @Override public void run() { while (true){ System.out.print原创 2021-03-14 22:41:14 · 226 阅读 · 0 评论 -
Java内存模型(JMM)
学习高并发时,有必要对JMM了解一下。特别是线程安全这一方面JMMJMM(Java Memory Model) 译:Java内存模型定义Java内存模型的主要目的为了:定义程序中各种变量的访问规则即关注虚拟机中把变量值存储到内存和从内存中取出变量值的底层细节。这里的变量包括实例字段、静态变量、数组对象等****但是不包括局部变量和方法参数,因为后者是线程私有的,不会被共享就不存在安全问题。JMM中关键技术都离不开 原子性、可见性、有序性原子性:简单说就是操作是不可分的,要么全部执行,要么都不执行。原创 2021-03-14 22:28:23 · 101 阅读 · 0 评论 -
多线程基本操作(重点)必看
高并发系列文章本文章来会议一下多线程中的基本操作,如有错误望指正。这篇文章您将看到高并发系列文章一、创建线程1.继承Thread2.实现Runnable接口二.中断线程1.原始终止2.中断线程总结一、创建线程创建一个线程对象十分简单,只需要new Thread()就可以创建好一个线程对象。然后调用start()方法即可开启线程。调用start()方法后线程会自动执行run()方法。注意:调用start()方法启动线程而不是直接调用run方法。举例简单创建一个线程对象并调用:public原创 2021-03-14 20:12:51 · 421 阅读 · 4 评论 -
第一篇:多线程学习之概念篇
学习多线程前我们一定要知道一些概念,所以第一篇我们主要介绍概念。知道概念很重要滴!我会尝试用专业术语加上我自己的语言争取将概念简单化,形象化。先看一下我们要学习的概念分别是什么吧概念篇1.并发与并行2.同步和异步3.临界区和临界资源4.死锁和活锁5.阻塞和非阻塞6.饥饿7.无饥饿,无等待,无阻塞1.并发与并行2.同步和异步3.临界区和临界资源4.死锁和活锁5.阻塞和非阻塞6.饥饿7.无饥饿,无等待,无阻塞...原创 2020-11-12 18:21:53 · 65 阅读 · 0 评论