![](https://img-blog.csdnimg.cn/20201014180756922.png?x-oss-process=image/resize,m_fixed,h_64,w_64)
Java并发编程
文章平均质量分 83
用手写的从前
如果你也喜欢周杰伦,那我们就是朋友
展开
-
Java线程池
我们之前学习过的数据库连接池,在某种程度上和Java线程池是思路一致的。因为频繁的创建数据库的连接对象,又销毁,在时间上开销较大。数据库连接池、线程池 意思都是类似的;原创 2023-08-21 08:00:00 · 360 阅读 · 4 评论 -
ThreadLocal内存泄漏问题
ThreadLocal很好地解决了线程之间需要数据隔离的问题,同时也引入了另一个问题,在应用程序中通常会使用线程池来管理线程,那么线程的生命周期与应用程序的生命周期基本保持一致,如果线程的数量很多,随着程序的运行,时间的推移,ThreadLocal类型的变量会越来越多,将会占用非常大的内存空间,从而产生内存泄漏,如果这些对象一直不被释放的话,可能会导致内存溢出。从图中可以看出,ThreadLocal对象存在于堆中,有栈中的强引用指向它,也有ThreadLocalMap中的entry的弱引用键指向他。原创 2023-08-17 12:21:02 · 888 阅读 · 4 评论 -
ThreadLocal(超详细介绍!!)
我们每个线程都会存储ThreadLocal对象的备份,那么存储在哪里呢,答案就是在ThreadLocalMap中,ThreadLocalMap为 ThreadLocal的一个静态内部类,里面定义了Entry来保存数据,那么既然是map,就会有键值对的结构,键的位置存的就是我们的ThreadLocal对象,而值存储的就是通过set方法存入的那个值,例如这一句代码:local.set( i);那么存到这个线程中的ThreadLocalMap的一个entry中,键和值就分别是 local:i。原创 2023-08-15 20:10:18 · 1116 阅读 · 6 评论 -
Java并发中的原子性、可见性和有序性
原子性(Atomic)就是不可分割的意思,是指在进行一系列操作的时候这些操作要么全部执行要么全部不执行,不存在只执行一部分的情况。可见性是指一个线程修改的共享变量的值可以被其他线程及时地看到。当一个线程修改了共享变量的值而其他线程还在使用这个值时,如果其他线程看到的仍然是修改之前的旧值,就会导致程序出错或者运行出现异常。有序性指的是程序按照代码的先后顺序执行原创 2023-06-22 12:00:00 · 335 阅读 · 0 评论 -
并发编程出现的问题以及解决方式
概念:即每次判断我的预期值A和内存中的值V是不是相同,如果不相同则说明该内存值已经被其他线程更新过了,因此需要拿到该最新值B作为预期值,重新判断。volatile修饰的内存变量添加内存屏障之外,还要通过缓存一致性协议(MESI)将数据写回到主内存,其他工作内存嗅探后把自己工作内存数据过期,重新从主内存读取最新的数据。在写入之前需要做一个判断,用预期值与主内存中的值进行比较,如果预期值与主内存中值一致,说明这个变量没有其他线程修改,则将更新后的值,写入到主内存;操作完写会主内存,有可能出现问题。原创 2023-02-12 12:00:00 · 412 阅读 · 0 评论 -
Java中ThreadLocal类详解
过程:先拿出调用set方法的线程,然后取出这个线程内部的副本变量,由ThreadLocalMap存储,如果不为空,说明之前已经加过值,通过ThreadLocalMap的set方法进行赋值,将原来的value换成新的即可。对象引用一般有五种状态:强引用(即对象是有引用指向的)、软引用、弱引用、虚引用、普通的失去引用的对象(与虚引用的区别是少了被回收时的系统通知)以这个类创建的变量,在多个线程都用到这个变量时,可以为每一个线程创建一个变量副本,使得多个线程之间这个变量相互隔离,不影响。原创 2023-02-17 12:00:00 · 553 阅读 · 0 评论 -
Java线程池
任务来了后,当核心线程池也满了,且队列满了后,但线程池还没满,此时就可以创建非核心线程执行任务,创建非核心线程;核心线程池,默认线程池创建之初,核心线程池数量是0,来一个任务创建一个线程,执行完后不销毁或者创建之初调用prestartAllCoreThreads()或者 prestartCoreThread()方法来创建线程。拒绝策略,核心线程池、阻塞队列、非核心线程池都已满,继续有任务来,我们需要采取的就是以下拒绝策略。线程和任务的关系:有任务来时,我们创建线程执行这个任务,即线程是用来执行任务的。原创 2023-02-15 12:00:00 · 290 阅读 · 0 评论 -
Java中的锁概述
底层实现也是通过AQS实现的,创建一个CountDownLatch对象后时构造方法中传入一个值,就是state的值,每当一个线程执行完毕,state就-1,直到所有线程都执行完,state等于0时,暂停的线程就可以回复工作了。当线程创建后,先判断state值,为0,没有线程使用,把state=1,执行完成后,将state=0,期间如果有其他的线程访问,state若等于1,将其他线程放入类中的队列中。:当锁状态为轻量级锁时,线程自旋达到一定的次数时,进入阻塞状态,锁状态升级为重量级,等待操作系统调度。原创 2023-02-13 12:00:00 · 420 阅读 · 0 评论