
并发编程
文章平均质量分 89
分享并发编程相关的知识
wh柒八九
一枚热爱编程的程序员
展开
-
JAVA多线程相关
本文记录java多线程相关的知识,部分资源来自于网络,大部分是基于本人对多线程的理解,而进行的总结。文章目录多线程的基本概念多线程的基本概念多线程的基本概念原创 2021-05-22 13:48:50 · 244 阅读 · 0 评论 -
Callable与Future模式
本文来说下Callable与Future模式文章目录概述概述原创 2022-03-18 13:23:19 · 434 阅读 · 0 评论 -
如何保证线程安全
本文来说下如何保证线程安全文章目录线程安全等级线程安全等级之前的博客中已有所提及“线程安全”问题,一般我们常说某某类是线程安全的,某某是非线程安全的。其实线程安全并不是一个“非黑即白”单项选择题。按照“线程安全”的安全程度由强到弱来排序,我们可以将java语言中各种操作共享的数据分为以下5类:不可变、绝对线程安全、相对线程安全、线程兼容和线程对立。...原创 2021-10-12 09:42:09 · 793 阅读 · 1 评论 -
J.U.C之并发工具类:Exchanger
本文来说下J.U.C之并发工具类:Exchanger文章目录概述概述前面三篇博客分别介绍了CyclicBarrier、CountDownLatch、Semaphore,现在介绍并发工具类中的最后一个Exchange。Exchange是最简单的也是最复杂的,简单在于API非常简单,就一个构造方法和两个exchange()方法,最复杂在于它的实现是最复杂的(反正我是看晕了的)。在API是这么介绍的:可以在对中对元素进行配对和交换的线程的同步点。每个线程将条目上的某个方法呈现给 exchange 方.原创 2021-09-01 16:23:34 · 285 阅读 · 0 评论 -
使用@Async进行异步调用详解
本文说下使用@Async进行异步调用详解文章目录概述概述原创 2021-08-30 09:47:34 · 240 阅读 · 0 评论 -
多线程的死锁问题
本文来说下多线程的死锁问题文章目录死锁讲解死锁讲解在Java中使用多线程,就会有可能导致死锁问题。死锁会让程序一直卡住,不再程序往下执行。我们只能通过中止并重启的方式来让程序重新执行。这是我们非常不愿意看到的一种现象,我们要尽可能避免死锁的情况发生!造成死锁的原因可以概括成三句话:当前线程拥有其他线程需要的资源当前线程等待其他线程已拥有的资源都不放弃自己拥有的资源...原创 2021-08-22 21:06:57 · 855 阅读 · 0 评论 -
JAVA后台线程
本文来说下JAVA 后台线程文章目录概述概述1.定义:守护线程–也称“服务线程”,他是后台线程,它有一个特性,即为用户线程提供公共服务,在没有用户线程可服务时会自动离开。2.优先级:守护线程的优先级比较低,用于为系统中的其它对象和线程提供服务。3.设置:通过 setDaemon(true)来设置线程为“守护线程”;将一个用户线程设置为守护线程的方式是在线程对象创建之前用线程对象的setDaemon方法。4.在Daemon线程中产生的新线程也是Daemon的。5.线程则是JVM级别的,以.原创 2021-08-13 13:42:49 · 459 阅读 · 0 评论 -
关于多线程的几个问题
本文来说下关于多线程的几个问题文章目录概述概述原创 2021-07-11 10:10:23 · 260 阅读 · 0 评论 -
线程顺序执行
本文来说下线程顺序执行,说到让线程顺序执行,我首先想到的就是join方法和同步器。本文来说下线程顺序执行的常见几种方法。文章目录概述概述本文使用了8种方法实现在多线程中让线程按顺序运行的方法,涉及到多线程中许多常用的方法,不止为了知道如何让线程按顺序运行,更是让读者对多线程的使用有更深刻的了解。使用的方法如下:[1] 使用线程的join方法[2] 使用主线程的join方法[3] 使用线程的wait方法[4] 使用线程的线程池方法[5] 使用线程的Condition(条件变量)方法[6.原创 2021-06-05 15:06:40 · 311 阅读 · 0 评论 -
ThreadLocal知识点详解
本文说下ThreadLocal的主要知识点文章目录概述详解概述ThreadLocal的作用主要是做数据隔离,填充的数据只属于当前线程,变量的数据对别的线程而言是相对隔离的,在多线程环境下,如何防止自己的变量被其它线程篡改。详解你能跟我说说它隔离有什么用,会用在什么场景么在Spring实现事务隔离级别的源码中,Spring采用Threadlocal的方式,来保证单个线程中的数据库操作使用的是同一个数据库连接,同时,采用这种方式可以使业务层使用事务时不需要感知并管理connection对.原创 2021-05-23 14:44:11 · 850 阅读 · 1 评论 -
ConcurrentHashMap深度分析(JDK 1.8版本)
本文深入解析ConcurrentHashMap:感受并发编程智慧。文章目录概述概述ConcurrentHashMap是个老生常谈的集合类了,我们都知道多线程环境下不能直接使用HashMap,而需要使用ConcurrentHashMap,但有没有了解过ConcurrentHashMap到底是如何实现线程安全的呢?他到底跟传统的Hashtable和SynchronizeMap(没听过SynchronizeMap?他就是Collections.synchronizeMap方法返回的对象)到底好在哪?.原创 2021-05-11 21:13:47 · 669 阅读 · 1 评论 -
Java中的各种锁事
本文来聊下Java中的各种锁文章目录锁概述锁概述本文来聊下Java中的各种锁,彻底理解Java中的各种锁。Java中的各种锁序号锁名称应用1乐观锁CAS2悲观锁synchronized、vector、hashtable3自旋锁CAS4可重入锁synchronized、Reentrantlock、Lock5读写锁ReentrantReadWriteLock,CopyOnWriteArrayList、CopyOnWriteA.原创 2021-05-11 09:39:47 · 199 阅读 · 1 评论 -
并发编程经典面试题
本文分享一些并发编程的经典面试题,看看你是不是都掌握了。文章目录多线程类的使用多线程类的使用java线程同步有哪些方法、各自的优缺点synchronized 和ReentrantLock区别,可重入锁是什么?threadlocal有什么用Java中创建线程有几种方式?分别是? 当主线程执行结束后,子线程还会继续执行下去吗?JUC中有哪些常用的集合?(项目中用到的)CopyOnWriteArrayList的实现原理?主要应用什么场景下?优缺点分别是?HashMap不是线程安全的,在高.原创 2021-05-04 17:52:14 · 497 阅读 · 0 评论 -
4种线程池详解
要配置一个线程池是比较复杂的,尤其是对于线程池的原理不是很清楚的情况下,很有可能配置的线程池不是较优的,因此在Executors类里面提供了一些静态工厂,生成一些常用的线程池。文章目录ExecutorService概述ExecutorService概述Java 里面线程池的顶级接口是 Executor,但是严格意义上讲 Executor 并不是一个线程池,而只是一个执行线程的工具。真正的线程池接口是 ExecutorService。Java通过Executors工厂类提供四种线程池,分别为:.原创 2021-04-22 16:46:04 · 2507 阅读 · 0 评论 -
浅析多线程中的各种锁
高并发的场景下,如果选对了合适的锁,则会大大提高系统的性能,否则性能会降低。所以,知道各种锁的开销,以及应用场景是很有必要的。文章目录常用的各种锁常用的各种锁原创 2021-04-18 15:24:46 · 1224 阅读 · 1 评论 -
多线程顺序打印的5种解法
多线程同步的方式有许多,有传统的synchronized锁,还可以使用lock锁,下面列举多线程顺序打印的5种解法,算作对线程同步的一个总结。文章目录经典面试题经典面试题1.三个线程分别打印 A,B,C,要求这三个线程一起运行,打印 n 次,输出形如“ABCABCABC…”的字符串2.两个线程交替打印 0~100 的奇偶数3.通过 N 个线程顺序循环打印从 0 至 1004.多线程按顺序调用,A->B->C,AA 打印 5 次,BB 打印10 次,CC 打印 15.原创 2021-04-17 13:39:24 · 10402 阅读 · 1 评论 -
深入理解并发容器ThreadLocal
在涉及到多线程需要共享变量的时候,一般有两种方法:其一就是使用互斥锁,使得在每个时刻只能有一个线程访问该变量,好处就是便于编码(直接使用 synchronized 关键字进行同步访问),缺点在于这增加了线程间的竞争,降低了效率;其二就是使用本文要讲的 ThreadLocal。如果说 synchronized 是以“时间换空间”,那么 ThreadLocal 就是 “以空间换时间” —— 因为 ThreadLocal 的原理就是:对于要在线程间共享的变量,为每个线程都提供一个这样的变量,使得这些变量是线程级.原创 2021-04-12 16:37:26 · 342 阅读 · 0 评论 -
并发容器(J.U.C)中的队列类
JUC包下的容器类分为两部分,一部分是并发集合类,一部分是并发队列类,其中并发集合类可以解决我们集合使用过程中的多线程并发问题,而并发队列类则主要被当做阻塞队列使用,是线程池中的关键参数之一。文章目录...原创 2021-04-12 13:44:15 · 411 阅读 · 0 评论 -
同步工具之Semaphore信号量
Semaphore可以理解为信号量,用于控制资源能够被并发访问的线程数量,以保证多个线程能够合理的使用特定资源。Semaphore就相当于一个许可证,线程需要先通过acquire方法获取该许可证,该线程才能继续往下执行,否则只能在该方法出阻塞等待。当执行完业务功能后,需要通过release()方法将许可证归还,以便其他线程能够获得许可证继续执行。文章目录Semaphore方法Semaphore实例Semaphore源码分析本文小结Semaphore方法Semaphore方法常用和需要注意的方.原创 2021-04-12 11:10:02 · 199 阅读 · 0 评论 -
同步工具之CyclicBarrier循环栅栏
CyclicBarrier 的字面意思是可循环使用(Cyclic)的屏障(Barrier)。它要做的事情是,让一组线程到达一个屏障(也可以叫同步点)时被阻塞,直到最后一个线程到达屏障时,屏障才会开门,所有被屏障拦截的线程才会继续干活。CyclicBarrier默认的构造方法是CyclicBarrier(int parties),其参数表示屏障拦截的线程数量,每个线程调用await方法告诉CyclicBarrier我已经到达了屏障,然后当前线程被阻塞。文章目录CyclicBarrier简介Cycli.原创 2021-04-11 20:18:47 · 303 阅读 · 0 评论 -
同步工具之CountDownLatch闭锁
CountDownLatch 一个同步辅助类,在完成一组正在其他线程中执行的操作之前,它允许一个或多个线程一直等待 ,即CountDownLatch允许一个或多个线程等待其他线程完成操作。闭锁可以延迟线程的进度直到其到达终止状态,闭锁可以用来确保某些活动直到其他活动都完成才继续执行。文章目录CountDownLatch简介CountDownLatch简介在多线程协作完成业务功能时,有时候需要等待其他多个线程完成任务之后,主线程才能继续往下执行业务功能,在这种的业务场景下,通常可以使用Thread.原创 2021-04-11 13:13:46 · 399 阅读 · 0 评论 -
深入理解无锁算法(CAS)
文章目录无锁算法原创 2021-04-10 13:55:34 · 2201 阅读 · 0 评论 -
并发容器(J.U.C)中的集合类
文章目录并发容器并发容器原创 2021-04-09 15:19:16 · 249 阅读 · 0 评论 -
Atomic包的4种类型详解
juc.locks子包的结构层次原创 2021-04-09 13:55:46 · 1890 阅读 · 0 评论 -
浅析Condition与等待通知机制
文章目录Condition简介Condition简介任何一个java对象都天然继承于Object类,在线程间实现通信的往往会应用到Object的几个方法,比如wait(),wait(long timeout),wait(long timeout, int nanos)与notify(),notifyAll()几个方法实现等待/通知机制,同样的, 在java Lock体系下依然会有同样的方法实现等待/通知机制。从整体上来看Object的wait和notify/notify是与对象监视器配合完成线程间的等待原创 2021-04-09 10:34:31 · 360 阅读 · 0 评论 -
浅析Lock工具类LockSupport
LockSupport是一个编程工具类,主要是为了阻塞和唤醒线程用的,所有的方法都是静态方法,可以让线程在任意位置阻塞,也可以在任意位置唤醒。使用它我们可以实现很多功能,今天主要就是对这个工具类的讲解,希望对你有帮助。文章目录...原创 2021-04-09 09:35:29 · 341 阅读 · 0 评论 -
浅析ReentrantReadWriteLock读写锁
文章目录ReentrantReadWriteLock简介ReentrantReadWriteLock简介原创 2021-04-08 16:04:40 · 180 阅读 · 0 评论 -
浅析ReentrantLock重入锁
ReentrantLock重入锁,是实现Lock接口的一个类,也是在实际编程中使用频率很高的一个锁,支持重入性,表示能够对共享资源能够重复加锁,即当前线程获取该锁再次获取不会被阻塞。在java关键字synchronized隐式支持重入性,synchronized通过获取自增,释放自减的方式实现重入。与此同时,ReentrantLock还支持公平锁和非公平锁两种方式。文章目录ReentrantLockReenTrantLock和synchronized的区别ReentrantLockReenTr.原创 2021-04-08 13:25:05 · 242 阅读 · 0 评论 -
深入理解AQS(AbstractQueuedSynchronizer)与初识Lock
concurrent包的结构层次原创 2021-04-07 16:16:56 · 567 阅读 · 0 评论 -
深入理解并发的关键字-volatile
volatile是Java提供的一种轻量级的同步机制。Java 语言包含两种内在的同步机制:同步块(或方法)和 volatile 变量,相比于synchronized(synchronized通常称为重量级锁),volatile更轻量级,因为它不会引起线程上下文的切换和调度。...原创 2021-04-07 10:23:35 · 319 阅读 · 0 评论 -
深入理解并发的关键字-synchronized
我们已经了解了Java内存模型的一些知识,并且已经知道出现线程安全的主要来源于JMM的设计,主要集中在主内存和线程的工作内存而导致的内存可见性问题,以及重排序导致的问题,进一步知道了happens-before规则。线程运行时拥有自己的栈空间,会在自己的栈空间运行,如果多线程间没有共享的数据也就是说多线程间并没有协作完成一件事情,那么,多线程就不能发挥优势,不能带来巨大的价值。那么共享数据的线程安全问题怎样处理?**很自然而然的想法就是每一个线程依次去读写这个共享变量,这样就不会有任何数据安全的问题,因为.原创 2021-04-02 15:22:33 · 399 阅读 · 1 评论 -
juc知识图谱
juc是java.util.concurrent的缩写,是jdk1.5后新增的java并发包,针对Java并发多线程并发程序设计,有助于Java开发人员写出高质量的并发程序。juc设计到的主要模块:1.collections2.executor3.atomic4.locks5.tools...原创 2021-04-02 14:07:10 · 480 阅读 · 0 评论 -
重排序
重排序处理器为提高运算速度而做出违背代码原有顺序的优化, 线程下的情况下可见性就会出现问题。在正常情况下是不对结果造成影响的。在单核时代处理器对结果的优化保证不会远离预期目标,但是在多核环境下却并非如此. 因为在多核条件下会有多个核执行指令,因此每个核的指令都有可能会乱序。另外处理器还引入了L1、L2缓存机制,这就导致了逻辑上后写入的数据不一定最后写入。在执行程序时,为了提高性能,编译器和处理器常常会对指令做重排序。重排序分为下面三种:编译器优化的重排序。编译器在不改变单线程程序语义的前提下,可以原创 2021-04-01 19:37:07 · 702 阅读 · 0 评论 -
JAVA内存模型与线程安全
文章目录CPU 多级缓存-乱序执行优化-重排序CPU 多级缓存-乱序执行优化-重排序处理器为提高运算速度而做出违背代码原有顺序的优化, 线程下的情况下可见性就会出现问题。原创 2021-03-31 16:09:11 · 433 阅读 · 0 评论 -
CPU多级缓存
文章目录什么是CPU缓存CPU缓存的来历什么是CPU缓存CPU缓存的来历众所周知,CPU是计算机的大脑,它负责执行程序的指令,而内存负责存数据, 包括程序自身的数据。在很多年前,CPU的频率与内存总线的频率在同一层面上。内存的访问速度仅比寄存器慢一些。但是,这一局面在上世纪90年代被打破了。CPU的频率大大提升,但内存总线的频率与内存芯片的性能却没有得到成比例的提升。并不是因为造不出更快的内存,只是因为太贵了。内存如果要达到目前CPU那样的速度,那么它的造价恐怕要贵上好几个数量级。所以,CPU的运算原创 2021-03-31 13:20:59 · 389 阅读 · 0 评论 -
线程的状态和基本操作
本文主要讲解下线程的生命周期以及与生命周期有关的5种常见状态,深刻理解线程的产生,运行,阻塞以及销毁。还有Java中与线程生命周期有关的常见方法以及区别。文章目录线程的生命周期线程的5种基本状态线程有关的常用方法join()方法yield()方法 线程的生命周期线程的5种基本状态新建(new):新创建了一个线程对象。可运行(runnable):线程对象创建后,当调用线程对象的 start()方法,该线程处于就绪状态,等待被线程调度选中,获取cpu的使用权。运行(running):可运.原创 2021-03-26 13:36:47 · 472 阅读 · 0 评论 -
线程池设计详解
随着计算机行业的飞速发展,摩尔定律逐渐失效,多核CPU成为主流。使用多线程并行计算逐渐成为开发人员提升服务器性能的基本武器。J.U.C提供的线程池:ThreadPoolExecutor类,帮助开发人员管理线程并方便地执行并行任务。了解并合理使用线程池,是一个开发人员必修的基本功。文章目录线程池是什么线程池是什么线程池(Thread Pool)是一种基于池化思想管理线程的工具,经常出现在多线程服务器中,如MySQL。线程过多会带来额外的开销,其中包括创建销毁线程的开销、调度线程的开销等等,同时也降.原创 2021-03-19 18:34:11 · 614 阅读 · 1 评论 -
悲观锁和乐观锁
悲观锁正如其名,它指的是对数据被外界(包括本系统当前的其他事务,以及来自外部系统的事务处理)修改持保守态度,因此,在整个数据处理过程中,将数据处于锁定状态。悲观锁的实现,往往依靠数据库提供的锁机制(也只有数据库层提供的锁机制才能真正保证数据访问的排他性,否则,即使在本系统中实现了加锁机制,也无法保证外部系统不会修改数据)。在悲观锁的情况下,为了保证事务的隔离性,就需要一致性锁定读。读取数据时给加锁,其它事务无法修改这些数据。修改删除数据时也要加锁,其它事务无法读取这些数据。乐观锁相对悲观锁而言,乐观原创 2021-03-03 16:24:46 · 464 阅读 · 1 评论 -
JAVA多线程
下面是关于多线程部分的记录1、java中如果我们自己没有产生线程,那么系统就会给我们产生一个线程(主线程,main方法就在主线程上运行),我们的程序都是由线程来执行的。...原创 2020-02-18 19:29:51 · 295 阅读 · 0 评论