![](https://img-blog.csdnimg.cn/20201014180756738.png?x-oss-process=image/resize,m_fixed,h_64,w_64)
并发
文章平均质量分 65
并发
方二华
这个作者很懒,什么都没留下…
展开
-
ThreadLocal内存泄漏的原因
Entry继承自WeakReference, Entry在构造函数使用super(k) 等同于 new WeakReference(key);如果不在key没被gc前,进行remove, 就没办法再通过key找到对应的value, value就会一直存在。也就是将key设置成弱引用, 当key的强引用都断开后,下次gc,key就会被清理掉。在扩容时, 会遍历Entry数组,清理掉key为null的数据。但如果一直不扩容, 则内存一直在占用, 所以需要手动清除下。此时Entry的key 就为null了。原创 2023-04-12 13:16:56 · 83 阅读 · 0 评论 -
ThreadPool
线程开启后会先执行一个提交的任务,然后再去阻塞队列去循环取任务执行,所以新开启的线程,可以直接运行一次任务,不用从队列里取。若当前线程数大于核心线程数, 使用超时阻塞取任务,若超时后仍然没有任务,则进行cas竞争,成功的线程跳出循环,结束线程。手动中断 shutdown shutdownNow, 直接对某一个线程中断无效,会被捕获中断,继续执行。可以自定义线程工厂类,给每个线程设置一个线程异常捕获方法,就可以自定义处理异常,而不会退出线程。当任务抛出异常后,线程也会被关闭,线程池会立即新增一个线程替补。原创 2023-04-12 13:09:26 · 46 阅读 · 0 评论 -
java - AQS
AQS是指AbstractQueuedSynchronizer类, 该类是JUC包下所有互斥锁的实现基础。它也是按照管程思想实现的。其中AQS,是管程的实现:state, 0无锁, 1有锁,大于1时表示锁重入了多次,加锁时一般通过cas修改state,修改成功意味着竞争到了锁。:通过双向链表实现,通过变量head tail维护,该队列按照先入先出,所以基于AQS的锁,很容易实现公平锁。原创 2023-04-12 13:05:34 · 102 阅读 · 0 评论 -
synchronized
当两个先后执行的线程,第一个线程完全结束后,开启第二个线程,共同持有同一个锁时,由于是先后执行没有交集都应该是偏向锁,并且锁头部中的线程id为各自线程。偏向锁撤销: 不等同于偏向锁解锁,偏向锁撤销一般是由于锁升级造成的,而加锁的前提条件是需要无锁状态,所以偏向锁撤销就是把锁的对象头转为无锁状态,然后等待加锁。需要等到安全点的时候。因为线程获取锁是通过cas操作的,在cas中,期望值是null,修改值为自身线程id, 所以锁切换线程时,必须要先变为无锁,才能再锁,否则cas无法成功。原创 2023-04-12 13:03:10 · 36 阅读 · 0 评论 -
并发可见性与总线窥探机制
在java并发编程中,要保证可见性,需要给变量增加volatile关键字。普通变量存在可见性的原因是多核CPU架构中各处理器缓存不一致造成的,需要解决缓存不一致问题,才能保证可见性,总线窥探就是实现缓存一致性的方案之一。原创 2023-03-21 23:32:39 · 111 阅读 · 0 评论 -
进程通信与线程通信
进程通信与线程通信原创 2023-03-21 23:32:53 · 50 阅读 · 0 评论