Java并发编程
文章平均质量分 92
Java并发编程系列
路上阡陌
得不高歌失不忧
展开
-
Java线程池常见面试题详解
CachedThreadPool 和上一种线程池 FixedThreadPool 的情况恰恰相反,FixedThreadPool 的情况是阻塞队列的容量是无限的,而这里 CachedThreadPool 是线程数可以无限扩展,所以 CachedThreadPool 线程池并不需要一个任务队列来存储任务,因为一旦有任务被提交就直接转发给线程或者创建新线程来执行,而不需要另外保存它们。每当提交一个任务就创建一个工作线程,如果工作线程数量达到线程池初始的最大数,则将提交的任务存入到池队列中。原创 2023-04-26 08:23:07 · 1133 阅读 · 0 评论 -
谈谈你对ThreadLocal的理解
以前我们使用的大部分引用实际上都是强引用,这是使用最普遍的引用。如果一个对象具有强引用,那就类似于必不可少的生活用品,垃圾回收器绝不会回收它。当内存空间不足,Java 虚拟机宁愿抛出 OutOfMemoryError 错误,使程序异常终止,也不会靠随意回收具有强引用的对象来解决内存不足问题。原创 2023-03-27 08:31:04 · 669 阅读 · 0 评论 -
AQS详解
AQS(AbstractQueuedSynchronizer)的核心原理图如下:AQS 使用 int 成员变量 state 表示同步状态,通过内置的 线程等待队列 来完成获取资源线程的排队工作。state 变量由 volatile 修饰,用于展示当前临界资源的获锁情况。// 共享变量,使用volatile修饰保证线程可见性。原创 2023-03-13 08:49:23 · 590 阅读 · 0 评论 -
Java锁机制详解
Java提供了种类丰富的锁,每种锁因其特性的不同,在适当的场景下能够展现出非常高的效率。本文旨在对锁相关源码(本文中的源码来自JDK 8)、使用场景进行举例,为读者介绍主流锁的知识点,以及不同的锁的适用场景。Java中往往是按照是否含有某一特性来定义锁,我们通过特性将锁进行分组归类,再使用对比的方式进行介绍,帮助大家更快捷的理解相关知识。原创 2023-02-07 09:52:00 · 1187 阅读 · 0 评论 -
Java并发常见面试题(三)
作用于非静态方法,锁住的是对象实例(this),每一个对象实例有一个锁。作用于静态方法,锁住的是类的 Class 对象,Class 对象全局只有一份,因此静态方法锁相当于类的一个全局锁,会锁所有调用该方法的线程。作用于 Lock.class,锁住的是 Lock 的 Class 对象,也是全局只有一个。作用于 this,锁住的是对象实例,每一个对象实例有一个锁。作用于静态成员变量,锁住的是该静态成员变量对象,由于是静态变量,因此全局只有一个。必须有“对象”来充当“锁”的角色。原创 2022-12-06 09:15:39 · 876 阅读 · 0 评论 -
Java并发常见面试题(二)
wait()方法是让获得对象锁的线程实现等待,并自动释放当前线程占有的对象锁。每个对象(Object)都拥有对象锁,既然要释放当前线程占有的对象锁并让其进入WAITING状态,自然要操作对应的对象(Object)而非当前的线程(Thread)。因为 sleep() 是让当前线程暂停执行,不涉及到对象类,也不需要获得对象锁。原创 2022-11-30 13:15:40 · 421 阅读 · 0 评论 -
Java并发常见面试题(一)
程序计数器可以看作当前线程所执行字节码的行号指示器,字节码解释器通过改变程序计数器的值来依次读取指令,从而实现对代码的流程控制,如顺序执行、选择、循环和异常处理等。在多线程场景下,程序计数器还用来记录当前线程执行的位置,从而当线程切换回来时能知道线程上一次运行到哪里了。需要注意的是,如果执行的是 native 方法,那么程序计数器记录的是 undefined 地址,只有执行的是 Java 代码时程序计数器记录的才是下一条指令的地址。所以,程序计数器线程私有主要是为了。原创 2022-11-23 12:23:50 · 358 阅读 · 0 评论 -
JMM(Java 内存模型)详解
所有线程创建的实例对象都存放在主内存中,不管该实例对象是成员变量还是方法中的本地变量(也称局部变量)每个线程都有一个私有的本地内存来存储共享变量的副本,并且,每个线程只能访问自己的本地内存,无法访问其他线程的本地内存。本地内存是 JMM 抽象出来的一个概念,存储了主内存中的共享变量副本。线程 A 把本地内存中修改过的共享变量副本的值同步到主内存中去。线程 B到主存中读取对应的共享变量的值。也就是说,JMM 为共享变量提供了可见性的保障。原创 2022-11-12 08:48:40 · 6732 阅读 · 0 评论 -
Java多线程基础详解(四)
Condition是在JDK1.5中才出现的,它用来替代传统的Object的wait()、notify()实现线程间的协作,相比使用Object的wait()、notify(),使用Condition的await()、signal()这种方式实现线程间协作更加安全和高效。notifyAll()中All的含义是所有的线程,而不是所有的锁,只能唤醒等待(调用wait()方法等待)同一个锁的所有线程,这一点一定要注意。notify()方法唤醒一个处于等待状态的线程(调用了wait()方法而进入等待状态的线程)。原创 2022-11-09 09:48:41 · 418 阅读 · 0 评论 -
Java多线程基础详解(三)
synchronized 翻译成中文是同步的的意思,主要解决的是多个线程之间访问资源的同步性,可以保证被它修饰的方法或者代码块在任意时刻只能有一个线程执行。这里只是初步介绍,在后续文章中我会详细介绍,后续文章完成后我会将连接更新到这里。JDK1.5后新增功能,与采用synchronized相比,lock可提供多种锁方案,更灵活。原创 2022-11-08 14:40:11 · 416 阅读 · 0 评论 -
Java多线程基础详解(二)
线程控制以及常用方法原创 2022-11-07 13:06:54 · 3699 阅读 · 3 评论 -
Java多线程基础详解(一)
线程可以看作轻量级进程,同类的线程共享进程的堆和方法区(JDK1.7及之前实现为永久代,JDK1.8及之后实现为元空间)资源,但是每个线程都有自己的程序计数器、Java虚拟机栈和本地方法栈,线程之间的切换开销比较小。线程的启动需要Thread类的start方法,如果采用继承的方式每次新建一个线程时,每个新建线程的数据都会单独的存在线程内存中,这样每个线程会单独的操作自己线程的数据,不能更好的实现线程之间的数据共享。:同一进程的线程共享本进程的地址空间和资源,而进程之间的地址空间和资源是相互独立的。原创 2022-11-04 14:08:28 · 449 阅读 · 0 评论