多线程并发编程
文章平均质量分 80
关于Java的多线程部分
堂诘柯德战风车
间歇性努力,持久性躺平
展开
-
从ReentrantLock看AQS(三)
上篇文章主要介绍了ReentrantLock的lock方法,这次来看看unlock的底层是如何实现的。原创 2022-04-18 23:49:46 · 162 阅读 · 0 评论 -
从ReentrantLock出发看AQS(二)
前言上一篇简要介绍了AQS和ReentrantLock,这一篇主要来看看ReentrantLock的底层是如何调用AQS的。Lock()首先来看看其中一个构造方法,可以选择公平锁或非公平锁。默认下是非公平模式,所以后面的方法默认前提是非公平锁的方法。public ReentrantLock(boolean fair) { this.sync = (ReentrantLock.Sync)(fair ? new ReentrantLock.FairSync() : new Reentra原创 2022-04-04 20:08:23 · 350 阅读 · 0 评论 -
从ReentrantLock出发看AQS(一)
AQS什么是AQS?是阻塞式锁和相关同步器工具的框架,如ReentrantLock内部就持有这个同步器,具体实现都是调用同步器的API实现加锁解锁==========================ReentrantLock中的Sync================================ private final ReentrantLock.Sync sync; public ReentrantLock() {//默认非公平 this.sync = new R原创 2022-04-01 23:59:10 · 550 阅读 · 0 评论 -
学习多线程前的必备知识
线程与进程对于操作系统来说,一个任务就是一个进程(Process),比如QQ。进程是系统进行资源分配和调度的基本单位在一个进程内部,运行的子任务就是线程(Thread),比如QQ的一个聊天窗口线程是操作系统进行运算调度的最小单位在同一进程中的各个线程,都可以共享该进程所拥有的资源协程运行在线程之上,协程并没有增加线程数量,只是在线程的基础之上通过分时复用的方式运行多个协程线程是动态概念,它的动态特性由线程控制块TCB(Thread Control Block)描述。TCB包括以下信息:(1原创 2022-02-18 03:15:05 · 425 阅读 · 0 评论 -
关于ThreadLocal不得不说的内容
概念每个Thread对象里有一个map,key是ThreadLocal的hashcode,value是我们放入的Object。每个线程都独享一块ThreadLocal Map。内存泄漏Map的Entry继承自WeakReference,所以它的key是弱引用。如果是强引用,即使threadlocal=null,key的引用仍然指向对象,造成内存泄漏。但在某些情况下还是会有内存泄漏的情况当使用static ThreadLocal的时候,延长了ThreadLocal的生命周期,也可能导致内存泄漏原创 2022-03-13 21:13:48 · 399 阅读 · 0 评论 -
多线程常用方法解析
上篇文章提到了线程的六种状态,这里来介绍一下如何利用线程提供的方法在这些状态之间互相转换。在这之前先初步介绍一下monitor锁,也叫内置锁。synchronize的底层就是它是实现的,它是由操作系统提供的,内部具有WaitSet, EntryList, Owner三个属性。我们经常会用synchronized(object)来实现同步代码块,如果上锁成功,则这个object就关联了一个monitor。Owner指向锁持有线程,在EntryList中的就是BLOCKED状态的线程,WaitSet中的就是原创 2022-02-28 23:16:39 · 114 阅读 · 0 评论 -
并发编程中关于锁的黑话略解
概念总结一波多线程学习中遇见的术语不可继承Synchronize定义的方法被子类覆盖后并不是同步的,也就是不可继承性虚假唤醒由于wait方法调用后,如果被唤醒就会直接执行wait后面的代码,如果此时wait在一个if判断body中,将不会再次执行判断,所以要用while替代if操作锁对象如果锁的是成员方法,锁对象是this,也就是调用方法的对象,如果是静态方法,则锁对象是类可重入锁Synchronize和Lock都是可重入锁,也就是能自由进出锁和内层锁,递归进入,一个线程可以重复获得同一个原创 2022-03-26 00:02:12 · 723 阅读 · 0 评论