Java多线程
文章平均质量分 86
Java多线程记录
素人岳
这个作者很懒,什么都没留下…
展开
-
【Java多线程】ThreadLocal内存泄露问题
内部维护的是一个的数据结构(类似于Map);每个线程都可以通过set()和get()来对这个局部变量进行操作,当然还有remove()方法;同一个所包含的对象,在不同的Thread中有不同的副本;适合那些需要公共方法,但私有变量的场景,如获取当前用户;不再被使用的对象或者变量占用的内存不能被回收,就是内存泄露;在这里要引到另外一个知识点,就是弱引用,不懂的看这篇文章;通过以上文章会得知:当系统进行GC时,只要垃圾回收器扫到,不管空间够不够,都会被回收;原创 2022-09-09 15:23:49 · 334 阅读 · 0 评论 -
【多线程】ThreadPoolExecutor运行逻辑详解
【代码】【多线程】ThreadPoolExecutor运行逻辑详解。原创 2022-08-29 21:43:48 · 392 阅读 · 0 评论 -
CompletableFuture异步编程详解
先来回顾下Future,Future是JDK1.5中添加的接口,主要功能为:但Future也有着非常明显的缺点:上面介绍了Future的缺点,这些问题都可以通过类解决,主要方法有:可以看出,supply开头的两个方法是有返回值的,而run开头的两个方法是没有返回值的,至于第二个方法传入的Executor,这个在编码中可以自定义;功能:当前任务正常完成以后,可将当前任务的返回值作为参数传给下一个任务;执行任务A,任务A执行完成之后,将任务A返回值作为参数传入给任务B,打印结果为3:实际场景以工作中常原创 2022-06-25 23:15:23 · 1078 阅读 · 0 评论 -
Java各种锁详解(思维导图)
框架中涉及到锁的相关实现,博客持续完善中;悲观锁实现:另外在Java中, 也算是悲观锁;乐观锁实现:实现有版本号机制 + (比较替换),以及Java中包下的几个原子变量类;为公平锁,而既是公平锁,也可以作为非公平锁:如何选择?如果为了更高的吞吐量,那么非公平锁比较合适,因为会节省多线程切换时间,否则的话,就使用公平锁。是指同一个线程在外层方法获取锁的时候,再进入该线程的内层的方法会自动获取锁(前提时锁的对象是同一个),不会因为之前已经获取过还没释放...原创 2022-06-16 21:32:26 · 538 阅读 · 0 评论 -
多线程的生命周期详解
线程的声明周期大概分为5个主要阶段:New(初始化)Runnable(就绪)Running(运行)Blocked(阻塞)Terminated(结束)1、New(初始化),当通过new方法新建一个线程之后,该线程就处于新建状态,此时仅由JVM为其分配内存,并初始化其成员变量的值。2、Runnable(就绪) ,当调用start()方法时,该线程处于就绪状态。Java虚拟机会为其创建方法调用栈和程序计数器,等待调度运行。3、Running(运行) ,如果处于就绪状态的线程获得了CPU,开始执原创 2020-09-01 22:09:03 · 258 阅读 · 0 评论 -
volatile修饰符的作用详解
volatile修饰的共享变量,具有以下两个特点:保证了不同线程对该变量操作的内存可见性有序性(禁止指令重排序)要更详细的理解volatile修饰符的作用,就要理解java内存模型,如果已经理解请跳过此段话,不然推荐看这里:https://blog.csdn.net/xianyun1992/article/details/107723694可见性:当一个变量被volatile修饰时,那么对它的修改会立刻刷新到主存,当其它线程需要使用该变量时,会去内存中读取新值。而普通变量则不能保证这一点。原创 2020-08-02 23:09:53 · 665 阅读 · 0 评论 -
Java内存模型详解(JMM)
JMM是一种规范,规范什么的呢,规范线程之间交互的。想要学好多线程,Java内存模型是必须要掌握的知识点,那么我就把我自己理解的内存模型写在这里,欢迎斧正。当计算机执行命令的时候,每个数据的操作都是CPU去执行的,而数据是放在一个在主存(可以理解为计算机的物理内存)的地方,所以呢,CPU在执行的时候,CPU的寄存器就要去频繁的操作主存中的数据:从主存中读取数据到CPU执行;将执行完成的数据再写入主存。这里会有一个问题,就是CPU处理能力太快了,快到主存跟不上,所以就导致在执行周期的大部分时间都原创 2020-08-02 17:22:04 · 478 阅读 · 0 评论 -
缓存一致性协议(MESI)详解
缓存一致性协议是Java内存模型中的一种协议,具体如图所示:缓存一致性协议分为四种状态:Modified(修改):数据有效,数据被修改了,和内存中数据不一致,数据只存在于本Cache中。Exclusive(独享):数据有效,数据和内存中的数据一致,数据只存在于本Cache中。Shared(共享):数据有效,数据和内存中的数据一致,数据存在多个Cache中。Invalid(无效):数据无效,一旦数据被标记为无效,那效果就等同于它从来没被加载到缓存中。缓存一致性协议工作流程/原理:CPU原创 2020-08-02 13:39:38 · 2991 阅读 · 2 评论 -
Java线程中wait()与sleep()区别
不同点:waitp()是用于线程间通讯的,sleep()只是用于短时间暂停当前线程的。调用wait()的时候会释放此线程持有的锁,但是调用sleep()不会释放掉锁(只会让出CPU,等sleep时间结束之后再来调度此线程)wait()方法应在同步代码块中调用,但是sleep()方法不需要。wait()是Object的方法,而sleep()是Thread类的方法。wait()是可以被notify()/notifyAll()方法唤醒的,但是sleep()方法则不会。相同点:线程的wait()原创 2020-07-23 01:45:41 · 529 阅读 · 0 评论 -
AtomicLong和LongAdder的区别是什么
AtomicLong特点:AtomicLong底层是基于CAS自旋操作的,如果在高并发的情况下,CPU会花费大量的时间和性能浪费到CAS自旋上面,非常影响CPU的性能(当然并发量小可以忽略不计)。LongAdder特点:LongAdder的特点就是分散热点,把value分成若干个段,底层类似于ConcurrentHashMap中的分段锁,每个线程只对属于自己的“那段”数据进行CAS操作,也就是说,在最理想的情况下,每个线程都有独立的锁,这样可以大量减少并发操作。总结:一些高并发的场景,比如原创 2020-07-21 00:51:34 · 272 阅读 · 0 评论 -
多线程停止的几种方法
想要让线程停止,一共有三种方法:正常运行结束导致停止,没什么好说的。通过thread.stop();方法停止,线程会马上停止,可能导致数据不同步,不建议使用。把线程设置为守护线程,当没有非守护线程时,JVM会自动退出。通过interrupt()中断进行停止(异常停止法),建议使用。下面详细的介绍下第三种方法:这个方法可以把线程设置为中断状态,一旦线程在阻塞状态(sleep(),wait(),join())下被中断,都会抛出java.lang.InterruptedException异常,我们原创 2020-07-20 14:40:41 · 1457 阅读 · 0 评论