摘要:
在线程池中一共有7个核心参数: corePoolSize 核心线程数目 - 池中会保留的最多线程数 maximumPoolSize 最大线程数目 - 核心线程+救急线程的最大数目 keepAliveTime 生存时间 - 救急线程的生存时间,生存时间内没有新任务,此线程资源会释放 unit 时间单位 阅读全文
posted @ 2025-06-12 23:53
笠大
阅读(17)
评论(0)
推荐(0)
摘要:
Java并发编程有三大核心特性,分别是原子性、可见性和有序性。 首先,原子性指的是一个线程在CPU中的操作是不可暂停也不可中断的,要么执行完成,要么不执行。比如,一些简单的操作如赋值可能是原子的,但复合操作如自增就不是原子的。为了保证原子性,我们可以使用synchronized关键字或JUC里面的L 阅读全文
posted @ 2025-06-12 23:52
笠大
阅读(13)
评论(0)
推荐(0)
摘要:
ConcurrentHashMap 是一种线程安全的HashMap。 JDK1.7的底层采用是分段的数组+链表 实现 JDK1.8 采用的数据结构跟HashMap1.8的结构一样,数组+链表/红黑二叉树。 在jdk1.7中 ConcurrentHashMap 里包含一个 Segment 数组。Seg 阅读全文
posted @ 2025-06-12 23:52
笠大
阅读(9)
评论(0)
推荐(0)
摘要:
我们只需要通过jdk自动的工具就能搞定 我们可以先通过jps来查看当前java程序运行的进程id 然后通过jstack来查看这个进程id,就能展示出来死锁的问题,并且,可以定位代码的具体行号范围,我们再去找到对应的代码进行排查就行了。 阅读全文
posted @ 2025-06-12 23:52
笠大
阅读(15)
评论(0)
推荐(0)
摘要:
死锁:一个线程需要同时获取多把锁,这时就容易发生死锁 例如: t1 线程获得A对象锁,接下来想获取B对象的锁 t2 线程获得B对象锁,接下来想获取A对象的锁 这个时候t1线程和t2线程都在互相等待对方的锁,就产生了死锁。 阅读全文
posted @ 2025-06-12 23:51
笠大
阅读(13)
评论(0)
推荐(0)
摘要:
第一,语法层面上: synchronized是关键字,源码在jvm中, 底层由C++实现,退出同步代码块会自动释放锁 Lock是接口,源码由jdk提供的,由Java实现,需要手动调用unlock方法释放锁。 第二,功能层面上: 两者都是悲观锁,都具备互斥,同步,可重入 Lock 提供了许多 sync 阅读全文
posted @ 2025-06-12 23:51
笠大
阅读(13)
评论(0)
推荐(0)
摘要:
ReentrantLock是一个可重入锁。调用 lock 方 法获取了锁之后,再次调用 lock,是不会再阻塞,内部直接增加重入次数 就行了,标识这个线程已经重复获取一把锁而不需要等待锁的释放。 ReentrantLock是属于juc包下的类,属于api层面的锁,跟synchronized一样,都是 阅读全文
posted @ 2025-06-12 23:50
笠大
阅读(19)
评论(0)
推荐(0)
摘要:
AQS的话,其实就一个jdk提供的类AbstractQueuedSynchronizer。他是多线程的队列同步器。就是一个锁框架。 像ReentrantLock,Semaphore都是基于AQS实现的。 内部有一个属性 state 属性来表示资源的状态,默认state等于0,表示没有获取锁,stat 阅读全文
posted @ 2025-06-12 23:50
笠大
阅读(8)
评论(0)
推荐(0)
摘要:
volatile 是一个关键字,可以修饰类的成员变量、类的静态成员变量,主要有两个功能 第一:保证了不同线程对这个变量进行操作时的可见性,即一个线程修改了某个变量的值,这新值对其他线程来说是立即可见的,volatile关键字会强制将修改的值立即写入主存。 第二: 禁止进行指令重排序,可以保证代码执行 阅读全文
posted @ 2025-06-12 23:50
笠大
阅读(15)
评论(0)
推荐(0)
摘要:
CAS 是基于乐观锁的思想:最乐观的估计,不怕别的线程来修改共享变量,就算改了也没关系,我吃亏点再重试呗。 synchronized 是基于悲观锁的思想:最悲观的估计,得防着其它线程来修改共享变量,我上了锁你们都别想改,我改完了解开锁,你们才有机会。 阅读全文
posted @ 2025-06-12 23:49
笠大
阅读(7)
评论(0)
推荐(0)
摘要:
CAS的全称是: Compare And Swap(比较再交换);它体现的一种乐观锁的思想,在无锁状态下保证线程操作数据的原子性。 具体实现流程是这样的:有一个当前内存值V,旧的预期值A,和即将更新的值B。当且仅当旧的预期值A与内存值V相同时,才会将内存值V改为B,并返回true,否则什么都不做,返 阅读全文
posted @ 2025-06-12 23:49
笠大
阅读(13)
评论(0)
推荐(0)
摘要:
Java内存模型是Java虚拟机规范中定义的一种非常重要的内存模型。它的主要作用是描述Java程序中线程共享变量的访问规则,以及这些变量在JVM中是如何被存储和读取的,涉及到一些底层的细节。 这个模型有几个核心的特点。首先,所有的共享变量,包括实例变量和类变量,都被存储在主内存中,也就是计算机的RA 阅读全文
posted @ 2025-06-12 23:49
笠大
阅读(12)
评论(0)
推荐(0)
摘要:
Java中的synchronized有偏向锁、轻量级锁、重量级锁三种形式,分别对应了锁只被一个线程持有、不同线程交替持有锁、多线程竞争锁三种情况。 重量级锁:底层使用的Monitor实现,里面涉及到了用户态和内核态的切换、进程的上下文切换,成本较高,性能比较低。 轻量级锁:线程加锁的时间是错开的(也 阅读全文
posted @ 2025-06-12 23:48
笠大
阅读(8)
评论(0)
推荐(0)
摘要:
synchronized 底层使用的JVM级别中的Monitor 来决定当前线程是否获得了锁,如果某一个线程获得了锁,在没有释放锁之前,其他线程是不能或得到锁的。synchronized 属于悲观锁。 synchronized 因为需要依赖于JVM级别的Monitor ,相对性能也比较低。 moni 阅读全文
posted @ 2025-06-12 23:48
笠大
阅读(14)
评论(0)
推荐(0)
摘要:
有三种方式可以停止线程 使用退出标志,使线程正常退出,也就是当run方法完成后线程终止 使用stop方法强行终止(不推荐,方法已作废) 使用interrupt方法中断线程 阅读全文
posted @ 2025-06-12 23:48
笠大
阅读(9)
评论(0)
推荐(0)
摘要:
共同点 wait() ,wait(long) 和 sleep(long) 的效果都是让当前线程暂时放弃 CPU 的使用权,进入阻塞状态 不同点 方法归属不同 sleep(long) 是 Thread 的静态方法 而 wait(),wait(long) 都是 Object 的成员方法,每个对象都有 醒 阅读全文
posted @ 2025-06-12 23:47
笠大
阅读(14)
评论(0)
推荐(0)
摘要:
notifyAll:唤醒所有wait的线程 notify:只随机唤醒一个 wait 线程 阅读全文
posted @ 2025-06-12 23:47
笠大
阅读(19)
评论(0)
推荐(0)
摘要:
嗯~~,我思考一下 (适当的思考或想一下属于正常情况,脱口而出反而太假[背诵痕迹]) 可以这么做,在多线程中有多种方法让线程按特定顺序执行,可以用线程类的join()方法在一个线程中启动另一个线程,另外一个线程完成该线程继续执行。 比如说: 使用join方法,T3调用T2,T2调用T1,这样就能确保 阅读全文
posted @ 2025-06-12 23:46
笠大
阅读(12)
评论(0)
推荐(0)
摘要:
在JDK中的Thread类中的枚举State里面定义了6中线程的状态分别是:新建、可运行、终结、阻塞、等待和有时限等待六种。 关于线程的状态切换情况比较多。我分别介绍一下 当一个线程对象被创建,但还未调用 start 方法时处于新建状态,调用了 start 方法,就会由新建进入可运行状态。如果线程内 阅读全文
posted @ 2025-06-12 23:46
笠大
阅读(9)
评论(0)
推荐(0)
摘要:
start(): 用来启动线程,通过该线程调用run方法执行run方法中所定义的逻辑代码。start方法只能被调用一次。 run(): 就是一个普通的方法,封装了要被线程执行的代码,可以被调用多次。 阅读全文
posted @ 2025-06-12 23:45
笠大
阅读(6)
评论(0)
推荐(0)

浙公网安备 33010602011771号