摘要: 在线程池中一共有7个核心参数: corePoolSize 核心线程数目 - 池中会保留的最多线程数 maximumPoolSize 最大线程数目 - 核心线程+救急线程的最大数目 keepAliveTime 生存时间 - 救急线程的生存时间,生存时间内没有新任务,此线程资源会释放 unit 时间单位 阅读全文
posted @ 2025-06-12 23:53 笠大 阅读(9) 评论(0) 推荐(0)
摘要: Java并发编程有三大核心特性,分别是原子性、可见性和有序性。 首先,原子性指的是一个线程在CPU中的操作是不可暂停也不可中断的,要么执行完成,要么不执行。比如,一些简单的操作如赋值可能是原子的,但复合操作如自增就不是原子的。为了保证原子性,我们可以使用synchronized关键字或JUC里面的L 阅读全文
posted @ 2025-06-12 23:52 笠大 阅读(10) 评论(0) 推荐(0)
摘要: ConcurrentHashMap 是一种线程安全的HashMap。 JDK1.7的底层采用是分段的数组+链表 实现 JDK1.8 采用的数据结构跟HashMap1.8的结构一样,数组+链表/红黑二叉树。 在jdk1.7中 ConcurrentHashMap 里包含一个 Segment 数组。Seg 阅读全文
posted @ 2025-06-12 23:52 笠大 阅读(6) 评论(0) 推荐(0)
摘要: 我们只需要通过jdk自动的工具就能搞定 我们可以先通过jps来查看当前java程序运行的进程id 然后通过jstack来查看这个进程id,就能展示出来死锁的问题,并且,可以定位代码的具体行号范围,我们再去找到对应的代码进行排查就行了。 阅读全文
posted @ 2025-06-12 23:52 笠大 阅读(9) 评论(0) 推荐(0)
摘要: 死锁:一个线程需要同时获取多把锁,这时就容易发生死锁 例如: t1 线程获得A对象锁,接下来想获取B对象的锁 t2 线程获得B对象锁,接下来想获取A对象的锁 这个时候t1线程和t2线程都在互相等待对方的锁,就产生了死锁。 阅读全文
posted @ 2025-06-12 23:51 笠大 阅读(6) 评论(0) 推荐(0)
摘要: 第一,语法层面上: synchronized是关键字,源码在jvm中, 底层由C++实现,退出同步代码块会自动释放锁 Lock是接口,源码由jdk提供的,由Java实现,需要手动调用unlock方法释放锁。 第二,功能层面上: 两者都是悲观锁,都具备互斥,同步,可重入 Lock 提供了许多 sync 阅读全文
posted @ 2025-06-12 23:51 笠大 阅读(7) 评论(0) 推荐(0)
摘要: ReentrantLock是一个可重入锁。调用 lock 方 法获取了锁之后,再次调用 lock,是不会再阻塞,内部直接增加重入次数 就行了,标识这个线程已经重复获取一把锁而不需要等待锁的释放。 ReentrantLock是属于juc包下的类,属于api层面的锁,跟synchronized一样,都是 阅读全文
posted @ 2025-06-12 23:50 笠大 阅读(9) 评论(0) 推荐(0)
摘要: AQS的话,其实就一个jdk提供的类AbstractQueuedSynchronizer。他是多线程的队列同步器。就是一个锁框架。 像ReentrantLock,Semaphore都是基于AQS实现的。 内部有一个属性 state 属性来表示资源的状态,默认state等于0,表示没有获取锁,stat 阅读全文
posted @ 2025-06-12 23:50 笠大 阅读(6) 评论(0) 推荐(0)
摘要: volatile 是一个关键字,可以修饰类的成员变量、类的静态成员变量,主要有两个功能 第一:保证了不同线程对这个变量进行操作时的可见性,即一个线程修改了某个变量的值,这新值对其他线程来说是立即可见的,volatile关键字会强制将修改的值立即写入主存。 第二: 禁止进行指令重排序,可以保证代码执行 阅读全文
posted @ 2025-06-12 23:50 笠大 阅读(11) 评论(0) 推荐(0)
摘要: CAS 是基于乐观锁的思想:最乐观的估计,不怕别的线程来修改共享变量,就算改了也没关系,我吃亏点再重试呗。 synchronized 是基于悲观锁的思想:最悲观的估计,得防着其它线程来修改共享变量,我上了锁你们都别想改,我改完了解开锁,你们才有机会。 阅读全文
posted @ 2025-06-12 23:49 笠大 阅读(5) 评论(0) 推荐(0)