![](https://img-blog.csdnimg.cn/20201014180756923.png?x-oss-process=image/resize,m_fixed,h_64,w_64)
多线程
文章平均质量分 89
喜欢敲代码的Apollo
应届毕业生,蚂蚁金服JAVA后端工程师,欢迎小伙伴们一起交流!
展开
-
对象锁和类锁的区别
对实例对象和类加锁的区别class Account { private int money; public Account(int money) { this.money = money; } public sell(){}}Account a = new Account(2000);Account b = new Account(2000);实例锁即sycronized(this),加载实例对象上,不同的实例对象之间的锁不冲突.当sell加了原创 2021-04-15 15:37:22 · 1729 阅读 · 0 评论 -
七种单例模式写法即介绍
参考文章https://blog.csdn.net/mnb65482/article/details/80458571https://blog.csdn.net/itachi85/article/details/50510124定义保证一个类仅有一个实例,并提供一个访问它的全局访问点。单例模式结构图:首先我们要先了解下单例的四大原则:1.构造私有。2.以静态方法或者枚举返回实例。3.确保实例只有一个,尤其是多线程环境。4.确保反序列换时不会重新构建对象。我们常用的单例模式有:饿原创 2021-04-13 00:36:27 · 398 阅读 · 0 评论 -
局部变量与成员变量的线程安全分析
局部变量与成员变量的线程安全分析前言观看黑马程序员全面深入学习java并发编程遇到了疑问,进行总结,同时发现了一篇文章写的也不错,是根据视频进行的总结。https://blog.csdn.net/m0_37989980/article/details/111400237线程安全分析成员变量和静态变量是否线程安全? 如果它们没有共享,则线程安全 如果它们被共享了,根据它们的状态是否能够改变,又分两种情况如果只有读操作,则线程安全如果有读写操作,则这段代码是临界区,需要考虑线程安原创 2021-04-08 09:54:06 · 1473 阅读 · 4 评论 -
线程与线程池创建详解
前言近期面试时被问得比较多的线程池,现在进行一个总结1.创建线程方式java有以下四种创建多线程的方式(具体可参考https://blog.csdn.net/jinxinxin1314/article/details/105695860)1:继承Thread类创建线程2:实现Runnable接口创建线程3:使用Callable和FutureTask创建线程4:使用线程池,例如用Executor框架创建线程Callable和Runnable都可以应用于executors。而Thread类原创 2021-02-27 15:20:34 · 821 阅读 · 2 评论 -
同步/异步/阻塞/非阻塞 IO
前言对于NIO以及同步异步的理解不是很深刻,对知识点进行了一下梳理,同时推荐一篇不错的文章!https://blog.csdn.net/twt936457991/article/details/89668350Q1:同步/异步/阻塞/非阻塞 IO 的区别?同步和异步是通信机制,阻塞和非阻塞是调用状态。同步同步 IO 是用户线程发起 IO 请求后需要等待或轮询内核 IO 操作完成后才能继续执行。异步异步 IO 是用户线程发起 IO 请求后可以继续执行,不等待内核 IO 操作的完成,当内核 IO原创 2021-02-25 11:00:52 · 999 阅读 · 0 评论 -
volatile的可见性和有序性以及对比syncronized
引言面试京东的时候对这个知识点有点遗忘,现在进行一下总结。JMM(Java内存模型)在 JDK1.2 之前,Java 的内存模型实现总是从主存(即共享内存)读取变量,是不需要进⾏特别的注意的。⽽在当前的 Java 内存模型下,线程可以把变量保存本地内存(⽐如机器的寄存器)中,⽽不是直接在主存中进⾏读写。这就可能造成⼀个线程在主存中修改了⼀个变量的值,⽽另外⼀个线程还继续使⽤它在寄存器中的变量值的拷⻉,造成数据的不⼀致。volatile的可见性jvm知道这个变量是使用volatile修饰,那么他原创 2021-02-24 22:03:45 · 384 阅读 · 0 评论 -
ArrayBlockingQueue源码详解
阻塞队列插入方法:add(E e) : 添加成功返回true,失败抛IllegalStateException异常offer(E e) : 成功返回 true,如果此队列已满,则返回 false。put(E e) :将元素插入此队列的尾部,如果该队列已满,则一直阻塞删除方法:remove(Object o) :移除指定元素,成功返回true,失败返回falsepoll() : 获取并移除此队列的头元素,若队列为空,则返回 nulltake():获取并移除此队列头元素,若没有元素则一原创 2021-02-20 19:31:10 · 636 阅读 · 1 评论 -
synchronized锁升级及锁优化
一、锁升级在1.6之前java中不存在只存在重量级锁,这种锁直接对接底层操作系统中的互斥量(mutex),这种同步成本非常高,包括操作系统调用引起的内核态与用户态之间的切换。线程阻塞造成的线程切换等。因此在jdk 1.6中将锁分为四种状态:由低到高分别为:无锁状态、偏向锁状态、轻量级锁状态、重量级锁状态。1. 偏向锁。什么是偏向锁呢?为什么要引入偏向锁呢? 偏向锁是如果一个线程获取到了偏向锁,在没有其他线程竞争的情况下,如果下次再执行该同步块时则只需要简单判断当前偏向锁所偏向的对象是否原创 2021-02-17 23:03:08 · 1290 阅读 · 0 评论 -
线程的六种状态以及sleep/wait/yield/join的区别
一.线程通常有五种状态:新建状态(New):新创建了一个线程对象。就绪状态(Runnable):线程对象创建后,其他线程调用了该对象的start()方法。该状态的线程位于可运行线程池中,变得可运行,等待 获取CPU的使用权。运行状态(Running):就绪状态的线程获取了CPU,执行程序代码。阻塞状态(Blocked):阻塞状态是线程因为某种原因放弃CPU使用权,暂时停止运行。直到线程进入就绪状态,才有机会转到运行状态。5.死亡状态(Dead):线程执行完了或者因异常退出了run()方法,该线程原创 2021-02-13 14:03:41 · 1575 阅读 · 1 评论 -
互斥锁、自旋锁、读写锁、悲观锁、乐观锁的应用场景
前言在编程世界里,「锁」更是五花八门,多种多样,每种锁的加锁开销以及应用场景也可能会不同。如何用好锁,也是程序员的基本素养之一了。高并发的场景下,如果选对了合适的锁,则会大大提高系统的性能,否则性能会降低。所以,知道各种锁的开销,以及应用场景是很有必要的。接下来,就谈一谈常见的这几种锁:正文多线程访问共享资源的时候,避免不了资源竞争而导致数据错乱的问题,所以我们通常为了解决这一问题,都会在访问共享资源之前加锁。最常用的就是互斥锁,当然还有很多种不同的锁,比如自旋锁、读写锁、乐观锁等,不同原创 2021-02-10 10:04:56 · 1697 阅读 · 0 评论 -
ThreadLocal详细讲解
标题ThreadLocal详细讲解(小白都能看懂)一、ThreadLocal的作用:我初始化一个ThreadLocal变量target,初始值即为null;在进程1里,我将它设为1;在进程2里,我获取这个初始值,他还是null,同时我将它设成3;在进程3里,我获取它,还是null。各个进程对于这个变量的操作都是独立的。二、ThreadLocal源代码讲解1.创建ThreadLocal对象。ThreadLocal<Integer> target = new ThreadLoca原创 2021-01-06 17:51:20 · 18510 阅读 · 8 评论