多线程
文章平均质量分 66
友农
一名大学生
展开
-
为什么说HashMap是线程不安全的?
一、头插法导致死循环在jdk1.7以前,HashMap在进行扩容时采用的是头插法,可能当时别人觉得这样比较高效,但是也带来了线程安全问题。刚开始时HashMap是这样的:正常扩容后是这样的:但如果是在多线程下,两个线程的指向3:此时线程1比线程2先执行,那么线程1就会指向7,将线程7.next指向了3,:但是对于线程2来说,3.next=7;所以就形成了死循环,也就是3和7构成了环。二、数据覆盖在jdk1.8以后,改了1.7以前的小毛病,但是新的问题又来了,我们来看下源码:原创 2022-04-25 10:10:28 · 5850 阅读 · 7 评论 -
常见锁策略和CAS你真的清楚了吗?
一、常见锁策略1.1乐观锁和悲观锁乐观锁:这种锁策略表示认为数据不会发生冲突,只有在数据更新时才会对冲突进行检测,如果没有发生冲突就可以直接更新数据,如果发生冲突就将数据返回给用户,让用户自己决定处理。(下文会讲解乐观锁的实现CAS)悲观锁:这种锁策略认为数据一定会发生冲突,所以在数据被访问的时候,就给数据加上锁,直到数据处理结束释放锁。(synchronized和Lock都是使用悲观锁策略)我们在认识锁策略的时候,不能只通过名称就辨别好坏,比如乐观锁和悲观锁,听起来悲观锁更逊色一些。但其实乐原创 2022-04-24 21:00:59 · 239 阅读 · 0 评论 -
java中wait()和sleep()的区别
一、wait和sleep的相同点都可以使线程休眠都可以响应interrupt的相应二、wait和sleep的区别wait和sleep在参数传递上大致相同,但传递值为0时,就是天壤之别,看下面的代码:public class Demo8 { public static void main(String[] args) { Thread thread1=new Thread(()->{ System.out.println("线程一开始启动")原创 2022-04-20 15:42:43 · 818 阅读 · 2 评论 -
Java中死锁产生的原因及解决方法
一、什么是死锁死锁就是指两个或两个以上的线程在执行过程中,由于竞争资源或者由于彼此通信而造成的现象,若无外力作用,他们都无法推进下去。简单来说就是A和B若同时都有一个资源,在此之外还想拥有对方的资源,由于资源如果在某个人手里,其他人就无法获得,所以变成了你不让我,我不让你,就僵持下了。下面我们来看下具体代码:public class CreateDeadThread { public static void main(String[] args) throws InterruptedExce原创 2022-04-20 09:00:52 · 8538 阅读 · 0 评论 -
synchronized的底层实现和运行原理
synchronized同步锁是通过JVM的监视器实现的,而监视器又是依赖操作系统的mutex实现的。监视器监视器就是一个概念或者机制,用来保障在任何时候,只有一个线程能够执行指定代码。synchronized的底层实现就是依赖JVM的监视器实现的执行流程HotSpot 虚拟机中,Monitor 底层是由 C++实现的,它的实现对象是 ObjectMonitor,ObjectMonitor 结构体的实现如下:ObjectMonitor::ObjectMonitor() { _head原创 2022-04-19 11:35:55 · 1463 阅读 · 0 评论 -
什么是线程安全问题,出现了你会解决吗?
这里写自定义目录标题欢迎使用Markdown编辑器新的改变功能快捷键合理的创建标题,有助于目录的生成如何改变文本的样式插入链接与图片如何插入一段漂亮的代码片生成一个适合你的列表创建一个表格设定内容居中、居左、居右SmartyPants创建一个自定义列表如何创建一个注脚注释也是必不可少的KaTeX数学公式新的甘特图功能,丰富你的文章UML 图表FLowchart流程图导出与导入导出导入欢迎使用Markdown编辑器你好! 这是你第一次使用 Markdown编辑器 所展示的欢迎页。如果你想学习如何使用Mar原创 2022-04-18 22:53:47 · 497 阅读 · 0 评论 -
线程的状态
一、线程的状态线程一般有7个状态,但jdk中只规定了6种状态(NEW、RUNNABLE、BLOCKED、WAITING、TIMED_WAITING、TERMINATED、),因为它把READY状态归为了RUNNABLE,我们可以通过以下代码查看线程的状态public class Test { public static void main(String[] args) { Thread.State[] arr=Thread.State.values(); for原创 2022-03-30 10:00:00 · 279 阅读 · 0 评论 -
你真的会用Thread类嘛?
一、线程创建线程的创建总的来说有7种方式,我把这几种方式分为以下三大类,其中有带返回值的(继承Thread类创建线程;实现Runnable接口创建线程),也有不带返回值的(实现Callable接口创建线程)。1.1继承Thread类创建线程1.继承Thread类创建线程这种方法创建线程显得太过复杂,一般不推荐public class ExtendThread { public static void main(String[] args) { CreadThread thr原创 2022-03-28 22:56:06 · 2049 阅读 · 0 评论 -
进程与线程的区别和联系
一、进程进程(Process)是操作系统分配资源的基本单位,⼀个进程拥有的资源有⾃⼰的堆、栈、虚存空间(⻚表)、⽂件描述符等信息。 从编程的⻆度来理解进程,可以把它看作是⼀个类或⼀个 PCB(Process Control Block)进程控制块的结构体。1.1进程的本质进程本质就是⼀个 PCB(Process Control Block)结构体,类似于 Java 中的类。进程中包括了以下几个属性:PID:进程的唯一身份标识(当重启进程后PID会更改)进程状态:新建状态、就绪状态、运行原创 2022-03-27 18:45:55 · 1538 阅读 · 0 评论