Java并发编程
文章平均质量分 71
Java并发编程知识及原理的分析与分享
向着百万年薪努力的小赵
当注意力专注于一件事上,岁月就会显得十分轻浮,快的有些过于浪荡——远近书疏,莫不手答,笔翰如流,未尝壅滞
展开
-
一文搞懂Synchronized同步锁的作用范围
我们对一个方法,这种执行方式很明显会影响程序的性能,那么如何做好安全性及性能的平衡呢?实际上,Synchronized关键字只需保护可能存在线程安全问题的代码,因此,我们可以通过控制同步锁的作用范围来实现这个平衡机制。在Synchronized中,提供两种锁,一是类锁,二是对象锁。...原创 2022-07-18 21:37:29 · 15008 阅读 · 0 评论 -
源码中的modCount是什么?有什么作用
在ArrayList,LinkedList,HashMap等等的内部实现增,删,改中我们总能看到modCount的身影modCount,字面意思就是修改次数但为什么要记录modCount的修改次数呢?大家发现一个公共特点没有,所有使用modCount属性的全是线程不安全的那么,我们情不自禁的就会想:这个字段大概是为了保证线程安全之类的吧阅读源码,发现这玩意只有在本数据结构对应的迭代器中才使用,以HashMap为例由以上代码可以看出,在一个迭代器初始的时候会赋予它调用这个迭代器的对象的modCount,原创 2022-07-09 21:22:30 · 29134 阅读 · 0 评论 -
ReentranLock及源码解析(学思想,一步一步点进源码)
我们知道在并发的场景下,如果同时对共享代码块进行访问时,会导致原子性、有序性、可见性问题。从而导致我业务出错。所以有时候,我们有些代码块不能进行并行,就得去改成串行!!之前我们已经知道了一个Synchronized重量级锁。该锁底层是JVM里面,通过monitor锁来实现串行,其他线程进行等待。那么我们今天要讲的,也是一个锁,只不过相关实现是在java层面去做的。就是可重入锁。虽然在性能上ReentrantLock和synchronized没有什么区别,但ReentrantLock相比synchronize原创 2022-07-08 14:10:01 · 59062 阅读 · 1 评论 -
ThreadLocal原理及源码解析(一步一步点进去,不要背了,学思想)
我们知道,一个共享变量或者资源,在多个线程操作的时候,肯定是会相互影响,不能隔离的比如,这样的代码,那么得到的结果,肯定是每次加10不定,还有因为原子性问题,肯定会出现相同的10.20…。那么假如我有场景,我要做到线程之前的数据相互不影响!!相互隔离,也就是我们讲的线程安全。比如mybatis里面,sqlsession就是存在ThreadLocal里面的,sqlSession这个对象就是线程安全的!!那么实现方式就是我们今天讲的重点:上面的栗子怎么 变得香甜 实现线程安全?如下:这样我们integer原创 2022-07-07 23:08:46 · 29938 阅读 · 1 评论 -
缓存一致性协议——MESI
我们知道,线程之间的可见性能用volatile关键字来解决,那么它为什么能解决呢?缓存包含L1(L1d-数据缓存(存放数据)、L1i指令缓存(执行数据的指令码))、L2、L3,其中L3是CPU共享,而L1和L2是每个cpu独占的缓存空间。这三级缓存都是集成在CPU内的缓存结构,他们的作用就是为CPU和主内存之间提供一个高速缓冲区,L1最靠近CPU核心;L2其次;L3再次。运行速度方面:L1最快、L2次快、L3最慢;容量大小方面:L1最小、L2较大、L3最大。CPU会先在最快的L1中寻找需要的数据,找不到再原创 2022-07-07 11:09:52 · 28454 阅读 · 0 评论 -
理解上下文切换带来的性能影响
在多任务操作系统中,为了提高CPU的利用率,可以让当前系统运行远多于CPU核数的线程。但是由于同时运行的线程数是由CPU核数来决定的,所以为了支持更多的线程运行,CPU会把自己的时间片轮流分给其他线程,这个过程就是上下文切换。 导致上下文切换的原因有很多,比如通过wait()、sleep()等方法阻塞当前线程,这时CPU不会一直等待,而是重新分配去执行其他线程。当后续CPU重新切换到当前线程时,CPU需要沿着上次执行的指令位置继续运行。因此,每次在CPU切换之前,需要把CPU寄存器和程序计数器保存起原创 2022-07-07 09:43:01 · 27811 阅读 · 3 评论 -
怎么查看线程的状态及interrupt优雅的关闭线程和interrupt()、interrupted()、isInterrupted()的作用以及区别在哪?
示例:查看状态:刚才我们讲过,一个线程里面任务正常执行完毕,状态就是TERMINATED,就是终止状态。但是,如果我线程里面的任务一直没有执行完成,我想去终止这个线程,或者我给点信息给到线程里,告诉线程我想终止结束呢!所以我可以强制去关闭线程:线程提供一个stop方法,该方法不建议使用,已经过时了!!因为stop是强行关闭线程,线程里面的任务都不在执行,不管线程的任务是否执行成功与否,就算执行到一半也会强制关闭!导致很多不可控制的结果,比如支付付一半等等!!所以我们要需要去优雅的关闭。什么叫做优雅关原创 2022-07-05 16:47:55 · 28498 阅读 · 0 评论 -
Java并发编程——提前预热所有核心线程
executorService.prestartAllCoreThreads();//可以提前预热所有核心线程仅为自己记忆学习用原创 2021-09-07 11:30:05 · 759 阅读 · 0 评论 -
Java并发编程——创建线程的三种方法以及区别
Java使用Thread类代表线程,所有的线程对象都必须是Thread类或其子类的实例。Java可以用三种方式来创建线程,如下所示:继承Thread类创建线程实现Runnable接口创建线程使用Callable和Future创建线程下面让我们分别来看看这三种创建线程的方法。------------------------继承Thread类创建线程---------------------通过继承Thread类来创建并启动多线程的一般步骤如下1】定义Thread类的子类,并重写该原创 2021-08-26 11:45:36 · 80327 阅读 · 90 评论 -
Java并发编程——happens-before规则
Happens-Before是一种可见性规则,它表达的含义是前面一个操作的结果对后续操作是可见的6种Happens-Before规则:程序顺序规则监视器锁规则Volatile变量规则传递性start()规则Join()规则原创 2021-09-01 21:34:15 · 2316 阅读 · 0 评论 -
Java并发编程——join的用法解析
join方法的作用;目的是保证线程执行结果的可见性什么意思呢,就是不出结果不罢休,我用了join方法,那你们就要等我执行完结果出来了你们才能继续执行。也可以说是同步,它可以使得线程之间的并行执行变为串行执行。在A线程中调用了B线程的join()方法时,表示只有当B线程执行完毕时,A线程才能继续执行。另外,Thread.join的本质其实是wait/notifyalljoin方法的原理就是调用相应线程的wait方法进行等待操作的,例如A线程中调用了B线程的join方法,则相当于在A线程中调用了B线原创 2021-08-26 11:25:38 · 638 阅读 · 0 评论 -
Java并发编程——四种线程池的使用及分析
执行一个异步任务你还只是new Thread吗?那你就out太多了,new Thread的弊端如下:a. 每次new Thread新建对象性能差。b. 线程缺乏统一管理,可能无限制新建线程,相互之间竞争,及可能占用过多系统资源导致死机或oom。c.缺乏更多功能,如定时执行、定期执行、线程中断。用线程池吧,少年相比new Thread,Java提供的四种线程池的好处a. 重用存在的线程,减少对象创建、消亡的开销,性能佳。b. 可有效控制最大并发线程数,提高系统资源的使用率,同原创 2021-09-06 15:58:01 · 1472 阅读 · 0 评论 -
Java并发编程——Thread类中interrupt()、interrupted()和isInterrupted()方法详解
interrupt()方法其作用是表示可以中断此线程实际上只是给线程设置一个中断标志,线程仍会继续运行。interrupted()方法作用是检查当前线程中断标志,返回一个boolean并清除中断状态连续两次调用返回结果不一样,因为第二次再调用时中断状态已经被清除,将返回一个false。isInterrupted()方法作用是只测试此线程是否被中断 ,不清除中断状态。下面我们进行测试说明:定义一个MyThread类,继承Thread,如下:public class MyThread ext转载 2021-08-26 22:43:23 · 824 阅读 · 1 评论 -
Java并发编程——final关键字
final关键字在我们日常所见到的代码中可谓是经常出现了,一般是用来修饰不再改变的参数。那么这个关键字与并发编程有什么关系呢?让我们先来看一下它的定义:final在Java中是一个保留的关理子,可以加收入能为亦这个引用了及本地变量。一旦你将引用声明作final,你将不能改变这个引用了由此引出一个问题,final关键字与线程安全有什么关系呢?对于final域,编译器和处理器要遵守两个重排序规则。 √在构造函数内对一个final域的写入,与随后把这个被构造对象的引用赋值给一个引用变量,这两个操原创 2021-09-01 21:26:09 · 178 阅读 · 0 评论 -
Java并发编程——volatile关键字使用
首先思考,volatile关键字是用来干什么的?volatile可以用来解决可见性和有序性的问题首先看一下什么是可见性:定义一个boolean型变量,然后阿巴阿巴阿巴阿巴(看代码看代码)代码示例:执行以上代码,大家猜结果是什么?没错,该线程一直执行,并没有因为stop值的改变而停止。因为该线程执行时stop的值 并没有因为主线程修改了stop值而被修改。也就是说主线程的操作结果对于该线程来说是不可见的。而当我们在stop上加上volatile关键字之后:该线程就捕捉到了sto原创 2021-09-01 21:04:31 · 200 阅读 · 0 评论 -
Java并发编程——Synchronized关键字解析
首先,让我们了解下这个关键字的作用,或者说是解决了什么问题 解决可见性、原子性、有序性问题 然后,再去看它是怎么使用的:简单介绍:synchronized是Java中的关键字,是一种同步锁。修饰一个代码块,被修饰的代码块称为同步语句块,其作用的范围是大括号{}括起来的代码,作用的对象是调用这个代码块的对象;修饰一个方法,被修饰的方法称为同步方法,其作用的范围是整个方法,作用的对象是调用这个方法的对象;修改一个静态的方法,其作用的范围是整个静态方法,作用的对象是这个类的所有对象;转载 2021-08-31 21:50:43 · 231 阅读 · 0 评论