![](https://img-blog.csdnimg.cn/2ccf8a5e22c04e49a3b523b2fe475bd9.jpeg?x-oss-process=image/resize,m_fixed,h_224,w_224)
多线程与并发编程
文章平均质量分 84
操作系统并发支持、阻塞队列、Java内存模型、线程池、并发集合、CAS与原子操作、ThreadLocal详解、JUC、JMH
悬浮海
正在准备系列内容,更新较少。
展开
-
多线程线程数设置多少合适
多线程线程数设置多少合适原创 2024-06-08 21:10:46 · 426 阅读 · 0 评论 -
轻量级锁与重量级锁的区别
轻量级锁与重量级锁、内核态与用户态原创 2023-08-12 17:49:53 · 173 阅读 · 0 评论 -
synchronized详解
synchronized详解原创 2023-08-12 16:52:16 · 77 阅读 · 0 评论 -
锁的四种状态及升级过程(JVM对synchronized的优化)
锁的四种状态及升级过程(JVM对synchronized的优化)原创 2023-07-23 13:47:05 · 148 阅读 · 0 评论 -
设计模式之不变模式
比如,一个对象的存活时间(对象创建时间和当前时间的时间差)是只读的,任何一个第三方线程都不能修改这个属性,但是这是一个可变的属性,因为随着时间的推移,存活时间时刻都在发生变化。如果父类是不变的,那么子类也必须是不变的,但实际上我们无法约束这点,为了防止子类做出一些意外的行为,这里干脆把子类都禁用了。此外,所有的元数据类、包装类都是使用不变模式实现的。由于基本数据类型和String类型在实际的软件开发中应用极其广泛,使用不变模式后,所有实例的方法均不需要进行同步操作,保证了它们在多线程环境下的性能。原创 2023-05-23 15:04:47 · 124 阅读 · 0 评论 -
Java并发设计中关于锁的优化
锁的优化,分为以下几个方面吧。原创 2023-05-19 15:49:50 · 504 阅读 · 0 评论 -
为什么要进行指令重排呢?
为什么要进行指令重排呢?答案是出于性能考虑。提高CPU处理性能原创 2023-05-09 20:13:24 · 537 阅读 · 0 评论 -
创建线程的几种方法
实现Runnable和实现Callable接口的方式基本相同,不过是后者执行call()方法有返回值,后者线程执行体run()方法无返回值,因此可以把这两种方式归为一种这种方式与继承Thread类的方法之间的差别如下:1、线程只是实现Runnable或实现Callable接口,还可以继承其他类。2、这种方式下,多个线程可以共享一个target对象,非常适合多线程处理同一份资源的情形。3、但是编程稍微复杂,如果需要访问当前线程,必须调用Thread.currentThread()方法。原创 2023-05-09 17:28:29 · 168 阅读 · 0 评论 -
wait() 一定需要notify()唤醒吗?
在主函数中,如果不使用join()方法等待T1线程,那么得到的i很可能是0或者一个非常小的数字。但在使用join()方法后,表示主线程愿意等待T1执行完毕,跟着T1一起往前走,故在join()方法返回时,T1已经执行完成,因此i总是100000。join()方法为加入的意思。在A线程中执行B线程的join()方法,A会等待B执行完之后,再继续执行。线程T1调用临界区资源OBJECT的wait()方法,进入这个资源对象的等待队列中,等待唤醒。正常情况很简单,也就是wait()与notify()方法的使用。原创 2023-05-09 17:52:38 · 510 阅读 · 0 评论 -
线程的基本操作(全)
文章目录线程的状态新建线程终止线程线程中断Thread.sleep()函数等待(wait)和通知(notify)挂起(suspend)和继续执行(resume)线程等待线程结束(join)谦让(yeild)线程的状态 public enum State { //新生 NEW, //运行 RUNNABLE, //阻塞 BLOCKED, //等待 WAITING, //超时等待 TIMED_WAITING, //终止 TERMINATED;}原创 2023-05-09 17:40:24 · 371 阅读 · 0 评论 -
java可以开启线程吗?
原因:java运行在虚拟机上,无法直接操作硬件,在start方法中调用了本地方法。,这是一个通过C++操作的方法。原创 2023-05-08 17:20:30 · 88 阅读 · 0 评论 -
wait()和sleep()的区别
wait()和sleep()的区别原创 2023-05-08 16:59:00 · 124 阅读 · 0 评论 -
1 JUC(高并发)
文章目录1.什么是JUC2.进程和线程3.并发与并行4.线程的状态(六个)5.wait/sleep的区别6.Lock锁与Synchronized(重点)6.1传统的Synchronized (关键字)6.2lock锁 (lock是一个接口)6.2.1 ReentrantLock 可重入锁中的公平锁与非公平锁6.2.2 与6.1不同的加锁方式的买票案例6.3Synchronized 和 Lock区别7.生产者与消费者问题(线程通信)7.1传统版本,用Synchronized实现的7.1.1存在的问题(虚假唤醒原创 2020-10-06 14:27:58 · 738 阅读 · 2 评论 -
人手一支笔:ThreadLocal 实现原理与源码详解
文章目录一、ThreadLocal是什么二、ThreadLocal怎么用三、ThreadLocal源码分析3.1 set()方法3.1.1 ThreadLocalMap、getMap()3.2 get()方法3.2.1 setInitialValue()方法3.3 remove()方法四、ThreadLocalMap与内存泄漏4.1防止内存泄露五、总结在保证线程安全时,我们可以对共享资源加锁来控制线程对资源的访问。这是第一种方式:加锁。除此之外,我们还可以通过增加资源来保证所有对象的线程安全,这就是第原创 2020-11-24 08:39:53 · 178 阅读 · 1 评论 -
JUC(17)java中有哪些原子操作
文章目录一、什么是原子操作二、Java中原子操作的实现方式2.1使用锁实现原子操作2.2使用CAS实现原子操作2.2.1 CAS实现原子操作的问题三、CPU如何实现原子操作3.1对于单核CPU3.2对于多核CPU一、什么是原子操作原子操作:一个或多个操作在CPU执行过程中不被中断的特性当我们说原子操作时,需要分清楚针对的是CPU指令级别还是高级语言级别。比如:经典的银行转账场景,是语言级别的原子操作;而当我们说volatile修饰的变量的复合操作,其原子性不能被保证(这里指的是CPU指令级原创 2020-11-24 08:39:16 · 562 阅读 · 0 评论 -
JUC(16)线程安全2:当我们说线程安全时,到底在说什么
文章目录前言一、多线程编程中的三个核心概念1.1原子性1.2可见性1.3顺序性(有序性)二、JMM2.1什么是JMM2.2内存划分2.3内存交互操作三、Volatile3.1 验证 保证可见性3.2 验证 不保证原子性3.3 验证 禁止指令重排(有序性)3.4小结四、Java如何解决多线程并发问题4.1Java如何保证原子性4.1.1锁和同步4.1.2CAS(compare and swap)4.2Java如何保证可见性4.3Java如何保证顺序性4.3.1happens-before原则(先行发生原则)五原创 2020-11-24 08:38:47 · 158 阅读 · 0 评论 -
JUC(15)线程安全1:如何保证线程安全
文章目录一、什么是线程安全二、线程安全状态(等级)2.1不可变2.2绝对线程安全2.3相对线程安全2.4线程兼容2.5线程对立三、线程安全的实现方法3.1互斥同步(阻塞同步)(悲观并发)3.2非阻塞同步 (乐观并发)3.3无同步方案3.3.1可重入代码(ReentrantCode)3.3.2栈封闭3.3.3线程本地存储(Thread Local Storage)一、什么是线程安全百科中是这样解释的:线程安全是多线程编程时的计算机程序代码中的一个概念。在拥有共享数据的多条线程并行执行的程序中,线程安全原创 2020-11-24 08:38:32 · 428 阅读 · 1 评论 -
JUC(14)让线程顺序执行的方法
文章目录一、可用的几种方法二、实现2.1 join()方法2.2 wait()方法2.3 线程池方法newSingleThreadExecutor()2.4 使用线程的Condition(条件变量)方法2.5 使用线程的CountDownLatch(倒计数)方法2.6 使用线程的CyclicBarrier(回环栅栏)方法三、总结一、可用的几种方法join()方法,让其他线程加入当前线程中。wait()方法,让当前线程进入等待状态使用线程的线程池方法:newSingleThreadExecutor(原创 2020-11-24 08:38:18 · 417 阅读 · 0 评论 -
JUC(13)高并发之AQS
文章目录一、概述1.1背景介绍二、需求2.1 功能2.2 性能目标三、AQS框架介绍3.1共享资源状态(state)3.2两种资源共享方式四、源码分析4.1结点状态waitStatus4.2 acquire(int)4.2.1 tryAcquire(int)4.2.2 addWaiter(Node)4.2.2.1 enq(Node)4.2.3 acquireQueued(Node, int)4.2.3.1 shouldParkAfterFailedAcquire(Node, Node)4.2.3.2 par原创 2020-11-12 22:15:34 · 274 阅读 · 0 评论 -
JUC(12)各种锁
文章目录一、公平锁与非公平锁二、可重入锁三、自旋锁四、死锁一、公平锁与非公平锁公平锁:非常公平;不能插队的,必须先来后到;非公平锁:非常不公平,允许插队的,可以改变顺序。(ReentrantLock 与 Synchronized 默认都是非公平锁)/** * Creates an instance of {@code ReentrantLock}. * This is equivalent to using {@code ReentrantLock(false)}. */public R原创 2020-11-24 08:37:51 · 149 阅读 · 0 评论 -
JUC(11)四大函数式接口和Stream流式计算
文章目录一、四大函数式接口(必需掌握)1.1 Function一、四大函数式接口(必需掌握)可参考 https://blog.csdn.net/wang_luwei/article/details/107600028 https://blog.csdn.net/wang_luwei/article/details/107600001新时代的程序员:lambda表达式、链式编程、函数式接口、Stream流式计算函数式接口:只有一个方法的接口,例如 @FunctionalInter原创 2020-11-24 08:36:58 · 228 阅读 · 1 评论 -
JUC(10)线程池
JUC(10)线程池此部分可以参考https://blog.csdn.net/wang_luwei/article/details/107490047线程池:三大方法、7大参数、4种拒绝策略池化技术程序的运行,本质:占用系统的资源!我们需要去优化资源的使用 ===> 池化技术线程池、JDBC的连接池、内存池、对象池 等等。。。。资源的创建、销毁十分消耗资源池化技术:事先准备好一些资源,如果有人要用,就来我这里拿,用完之后还给我,以此来提高效率。线程池的好处:1、降低原创 2020-11-23 15:14:08 · 127 阅读 · 0 评论 -
无锁:CAS算法 与 原子类
文章目录一、CAS1.1java层面的CAS1.2unsafe类1.3小结二、原子引用类解决ABA问题2.1ABA问题2.2原子引用类解决ABA问题一、CAS1.1java层面的CASCAS:Compare and Swap,即比较再交换。jdk5增加了并发包java.util.concurrent.atomic.*,其下面的类使用CAS算法实现了区别于synchronouse同步锁的一种乐观锁。JDK 5之前Java语言是靠synchronized关键字保证同步的,这是一种独占锁,也是是悲原创 2020-11-23 15:12:05 · 220 阅读 · 0 评论 -
JUC(8)Java内存模型-JMM和Volatile关键字
文章目录一、JMM1.1什么是JMM1.2内存划分1.3内存交互操作二、Volatile2.1 验证 保证可见性2.2 验证 不保证原子性2.3 验证 禁止指令重排(有序性)2.4小结一、JMMJMM (java memory model) 即为JAVA 内存模型 ,不存在的东西,是一个概念,也是一个约定!关于JMM的一些同步的约定:1、线程解锁前,必须把共享变量立刻刷回主存;2、线程加锁前,必须读取主存中的最新值到工作内存中;3、加锁和解锁是同一把锁;1.1什么是JMMJMM即原创 2020-11-23 15:10:13 · 241 阅读 · 0 评论 -
JUC(7)同步控制(辅助类)
文章目录一、 CountDownLatch(倒计时器)二、CyclicBarrier(循环栅栏)三、 Semaphore(信号量)四、读写锁ReadWritelock(读写锁)一、 CountDownLatch(倒计时器)其实就是一个减法计数器,对于计数器归零之后再进行后面的操作,这是一个计数器!package com.wlw.add;import java.util.concurrent.CountDownLatch;//减法计数器//有必须要在一些任务完成之后才能执行的任务(注意顺原创 2020-11-23 15:07:33 · 168 阅读 · 0 评论 -
JUC(6)Callable与Runnable的区别、Future
文章目录一、Runnable二、Callable(简单)三、FutureTask(很有用)四、Callable 接口和 Runnable接口的区别五、异步回调 Future5.1没有返回值的 runAsync() 异步回调5.2有返回值的supplyAsync() 异步回调5.3与Callable在线程池中的使用一、RunnableRunnable应该是我们最熟悉的接口,它只有一个run()函数,用于将耗时操作写在其中,该函数没有返回值。然后使用某个线程去执行该runnable即可实现多线程,Thre原创 2020-11-23 15:02:42 · 331 阅读 · 1 评论 -
JUC(5)线程安全与不安全的集合
文章目录一、List中的不安全 (ArrayList 是不安全的)二、 set 中的不安全三、 map中的不安全四、阻塞队列(BlockingQueue接口)4.1SynchronousQueue同步队列此部分可查看 https://blog.csdn.net/wang_luwei/article/details/107490131一、List中的不安全 (ArrayList 是不安全的)可对比参考:https://www.cnblogs.com/zz-ksw/p/12774371.htmlpack原创 2020-11-23 15:00:56 · 279 阅读 · 0 评论 -
JUC(4)八锁现象(关于锁的8个问题)
文章目录一、问题1与问题2二、 问题3与问题4三、 问题5与问题6四、问题7与问题8五、小结锁是什么,如何判断锁的是谁?8锁,就是关于锁的8个问题一、问题1与问题2问题一:标准情况下,下面的AB两个线程哪个先执行? 发消息? or 打电话?问题一答:总是先执行 发消息send() 再执行打电话call()。(为什么? 如果你认为是顺序在前? 这个答案是错误的!)问题二:让send() 方法休眠4s,此时AB两个线程哪个先执行?问题二答:还是先执行 发消息send() 再执行打电话原创 2020-11-23 14:58:51 · 1266 阅读 · 0 评论 -
JUC(3)生产者与消费者问题(线程通信)
文章目录一、传统版本,用Synchronized实现的1.1存在的问题(虚假唤醒),线程不只两个时二、juc版(lock锁)的生产者与消费者问题三、Condition 条件 有什么用呢?线程之间的通信问题:生产者与消费者问题一、传统版本,用Synchronized实现的package com.wlw.producerandconsumer;/** * 线程之间的通信问题:生产者与消费者问题 * 两个线程交替执行,操作同一变量,一开始为0,A B 一个执行+1 另一个执行-1 */pu原创 2020-11-23 14:56:52 · 194 阅读 · 0 评论 -
JUC(2)Lock锁与Synchronized(重点)
文章目录一、传统的Synchronized (关键字)二、lock锁 (lock是一个接口)2.1 ReentrantLock 可重入锁中的公平锁与非公平锁2.2与Synchronized不同的加锁方式的买票案例(Lock锁)三、Synchronized 和 Lock区别一、传统的Synchronized (关键字)一个买票案例package com.wlw.demo01;/** * 真正的多线程开发 * 线程就是一个单独的资源类,没有任何的附属操作! (只有属性和方法) */publi原创 2020-11-23 14:54:36 · 161 阅读 · 0 评论 -
JUC(1)JUC概述与线程基础知识
文章目录1.什么是JUC2.进程和线程3.并发与并行4.线程的状态(六个)5.wait/sleep的区别1.什么是JUC在Java中,线程部分是一个重点,本篇文章说的JUC也是关于线程的。JUC就是java.util .concurrent工具包的简称。这是一个处理线程的工具包,JDK 1.5开始出现的。2.进程和线程进程是正在运行的程序,是系统进行资源分配的基本单位 (一个程序:例如QQ.exe,Music.exe)线程,又称轻量级进程(Light Weight Process)。原创 2020-11-23 14:52:42 · 268 阅读 · 0 评论 -
74 java多线程_6 _线程安全的集合
文章目录线程安全的集合问题演示解决问题并发包中提供的线程安全集合CopyOnWriteArrayListCopyOnWriteArraySetQueue接口(队列)ConcurrentLinkedQueue(无界队列,非阻塞队列)BlockingQueue接口(阻塞队列,有界的队列)阻塞队列实现类:ArrayBlockingQueueLinkedBlock ingQueue:ConcurrentHashMapConcurrentHashMap,jdk1.7与jdk1.8的区别concurrentHashMa原创 2020-07-21 15:34:44 · 169 阅读 · 0 评论 -
73 java多线程_5 _线程池
文章目录线程池概念线程池原理创建线程池,线程池APICallable接口Callable的基本使用Callable结合线程池的使用Future接口线程同步和异步线程同步线程异步Lock接口(与synchronized)Lock接口的实现类:ReentrantLockLock接口的实现类:ReentrantReadWriteLock线程池概念问题:线程是宝贵的内存资源、单个线程约占1MB空间,过多分配易造成内存溢出。频繁的创建及销毁线程会增加虚拟机回收频率、资源开销,造成程序性能下降。线原创 2020-07-21 15:32:27 · 142 阅读 · 0 评论 -
72 java多线程_4 _线程安全、线程同步与线程通信
文章目录1.线程安全问题1.1多线程安全问题:2.线程安全2.1同步机制:同步方式12.1.1同步代码块:2.1.2线程阻塞状态2.2同步机制:同步方式22.2.1同步方法2.3同步规则3.经典问题3.1死锁4.线程通信4.1常用方法4.2还是存取钱的例子(存一下,取一下):4.3多存多取问题与全部等待问题5.生产者消费者问题6.小结1.线程安全问题需求: A线程将“Hello"存入数组; B线程将“World"存入数组。出现的问题:A线程查找下标0,此时这个位置是空的,但是还没有存入数据,时间片原创 2020-07-21 15:28:02 · 193 阅读 · 0 评论 -
71 java多线程_3 _线程状态与常见方法
71 java多线程_3 _线程状态与常见方法线程状态(基本四状态)线程常见方法sleep()休眠public static void sleep(long millis) 当前线程主动休眠millis毫秒。package com.wlw.thread;public class SleepThread extends Thread { @Override public void run() { for (int i = 0; i < 10; i++)原创 2020-07-21 15:23:25 · 122 阅读 · 0 评论 -
70 java多线程_2 _线程的组成与创建线程
文章目录线程组成线程特点创建线程创建线程(一)第一种方式:获取和修改线程名称卖票案例创建线程(二)第二种方式:补充使用匿名内部类:Runnable案例1:Runnable案例2:线程组成任何一个线程都具有基本的组成部分:CPU时间片:操作系统(OS)会为每个线程分配执行时间。运行数据:堆空间:存储线程需使用的对象,多个线程可以共享堆中的对象。栈空间:存储线程需使用的局部变量,每个线程都拥有独立的栈。线程的逻辑代码。线程特点线程抢占式执行:效率高可防止单一线程长时原创 2020-07-21 15:19:20 · 180 阅读 · 0 评论 -
69 java多线程_1 _线程概述
69 java多线程_1 _线程概述什么是进程进程是正在运行的程序,是系统进行资源分配的基本单位目前操作系统都是支持多进程,可以同时执行多个进程,通过进程ID区分(可以看看电脑的任务管理器)在单核CPU时代,在同一时刻,只能运行一个进程;宏观并行,微观串行(来回切换)现在是多核CPU,可以真正实现在同一时刻,有多个进程执行什么是线程线程,又称轻量级进程(Light Weight Process)。是进程中的一条执行路径,也是CPU的基本调度单位。一个进程由一个或多个线程组成,彼此间完成不原创 2020-07-21 15:17:32 · 230 阅读 · 0 评论