java相关
小燃儿
java developer。
微信公众号:程序员小燃 【i_java_code】
展开
-
GC怎么判断对象死亡和几种回收算法
1 GC垃圾回收的原理其实垃圾回收的原理很简单:就是判断出死亡的对象,然后清除死亡的,留下存活的即可。那么怎么判断对象已经死亡呢?常有的有以下两种:1)引用计数法(Reference Counting):在对象中添加一个引用计数器,每当一个地方引用它时,计数器就加1;当引用失效时,计数器就减1;当引用计数为0时就会被回收。但是它存在一个很大的问题就是循环引用:如下图,当实例化A时,A会持有实例B,B会持有C,C持有A。这样一来我们就会发现:如果需要回收A,除了释放初始实例化引用,还需要释放C的原创 2020-09-24 22:37:44 · 294 阅读 · 0 评论 -
程序员需要知道ThreadLocal的这几个点
1 什么是ThreadLocalThreadLocal是什么呢?在实际开发中经常被用来绑定用户信息、日志号。数据库连接等等。这样一来,我们编码时就不用通过传递参数方式而影响业务逻辑。就如名字一般,我们可以简单的认为它的作用就是把数据绑定到当前线程上,然后用于后续的操作。既然是将数据绑定到当前线程上,那最方便高效的数据存储方式就是key-value的hash方式存储了。不过不同于HashMap的实现方式,它单独提供了一个叫做ThreadLocalMap的Map类,与HashMap有着类似的功能,但是区别原创 2020-09-22 21:26:56 · 193 阅读 · 0 评论 -
AQS-用写公司简章方式理解读写锁(ReentrantReadWriteLock)
读写锁,顾名思义。这是一种对于两种不同行为的同步器工具,而读写是两种互斥的行为(写的时候,不能读。读的时候不能写),因此ReentrantReadWriteLock锁也具有此特性。1 用写公司简章过程理解读写锁想象一下,你正在写一份公司内部管理的简章,而笔只有一支(写锁),所以只有当你拿到这只笔(获取写锁)后才可以写内容。写完后(释放锁),简章就可以张贴出去让同事去阅读了(同时阅读:读锁)。但是这个时候你发现简章上写的有些问题,需要重新修改一下。不过你需要等你这些同事看完全部离开之后(释放读原创 2020-09-08 16:49:15 · 151 阅读 · 0 评论 -
AQS-用配钥匙和保险箱理解可重入锁(ReentrantLock)
今天我们来学习可重入排他锁,它同样是JUC包下使用AQS同步框架来实现的,因此代码比较简洁,只要了解了AQS的原理那么就会觉得it is so easy。1 怎么理解可重入锁排他,说明锁只能被一人占有(就类似信号量(semaphore)为1,每一时刻只能有一人拥有)。可重入,同一个人可以多次使用同一资源,这非常合理。试想一下,当一只保险箱的钥匙归你所属后,难道你不能再去锁匠那再配一把来开箱子吗?在这个法制社会里,钥匙是你的,那你去配钥匙肯定是合法的,至于你为什么要配钥匙呢?一家人嘛,不过我相信你不可能把原创 2020-09-02 22:21:39 · 169 阅读 · 0 评论 -
AQS-用购票的方式理解信号量(Semaphore)
在有些情况下,由于资源的限制,程序无法支持无限量的线程并发,因此引入信号量(Semaphore),只有获取信号量凭证的线程才允许执行。1用购票理解信号量(Semaphore)就好比我们乘坐火车一样,座位数量(信号量大小)是一定的。只有买到车票(获取信号量)的人才允许上车,当车票售完了,没有车票的人(没有获取信号量)是不允许上车的。只有等到有人下车,或者退票(释放持有信号量)后,等待的人才可以购票(获取信号量)上车:其实现方式也非常简单,是基于java提供的AQS同步器框架实现的,因此只要理解了AQS原创 2020-08-31 17:20:57 · 192 阅读 · 0 评论 -
用火车购票的方式打开 AQS同步器(二)
1 引言上篇文章讲述了java AQS结构以及其中排他API的 实现逻辑。而这一篇我们来看看其共享逻辑, 这里依旧使用上文的火车买票为例,便于理解。这里直接会从代码实现讲起,对于还不了解AQS的结构的建议先看一下上一篇文章:用火车购票的方式打开 AQS同步器(一)2 AQS共享和排他逻辑的区别共享实现方式与排他逻辑非常类似(毕竟是框架嘛)。排他逻辑其实可以看作是共享逻辑的一种特例,由于它的独占特性。排他逻辑tryAcquire方法返回值为真假,表示是否资源(一票一车的情况)已经被其他人占用。而共享逻辑原创 2020-08-28 11:51:37 · 115 阅读 · 0 评论 -
用火车购票的方式打开 AQS同步器(一)
引言AQS(AbstractQueuedSynchronizer,下文直接使用AQS的简称)是java JUC包下提供的,基于FIFO队列,可以用于构建锁或者其他相关同步装置的基础框架,使用者可以继承它来实现阻塞锁或者其他功能。由于是一个框架,所以其概念会比较抽象,因此这里会使用乘火车车购票的例子来帮助理解。AQS同步器结构-成员变量AQS的三个重要的成员变量,其功能都是围绕这三个变量实现的。 /** * Head of the wait queue, lazily initializ原创 2020-08-26 23:44:40 · 215 阅读 · 0 评论 -
用租车的方式打开java线程池,原理太简单了!
线程的创建和销毁是比较费时的,所以我们会通过使用线程池来复用线程,降低资源消耗,提高响应。同时使用线程池可以避免无限制的创建线程,防止耗尽计算机资源。(以下用租车为例,来模拟线程)1.租车公司讲线程池a. 如果你去一个远的地方,你就会需要一辆车。造一辆车耗费的资源可想而知,而到达目的地后,这辆车 对你又没有用了。 线程就像这辆车一样,不过它z在使用后,本着不浪费的原则系统就会销毁线程回收这一部分资源。b. 而现实中我们也可以选择租车出行,出租车是属于出租车公司的,就如同线程池的线程。-原创 2020-08-25 10:59:11 · 115 阅读 · 0 评论 -
一文搞懂LinkedList
01 原理LinkedList底层采用双向链表实现。与ArrayList不同,链表不需要扩容,除此之外还会有以下特点。02 特点非连续的内存,因此不支持随机访问,只能通过节点持有的指针,依次向后(向前)查找就安排,查找的复杂度高。2. 插入操作性能好。只需要插入位置的前后节点的引用指向该节点即可。3. 删除性能好,与插入类似,将删除节点前后节点的引用互相指向即可。03 源码最后从源码里具体分析一下,LinkedList中的添加(add),查找(get),删除(.原创 2020-07-18 12:21:07 · 131 阅读 · 0 评论 -
ThreadPoolExecutor 之执行与关闭
文章目录1.类结构2. 线程池流程和execute方法2.1 addWorKer()方法2.2 Work 的runWorker方法3. 线程池空闲线程的释放4. 线程池的关闭4.1 shutdown和shutdownNow4.2 共同方法:tryTerminate1.类结构Executor接口。该接口定义执行器执行方法execute。ExecutorService接口。该接口定义管理执行...原创 2019-04-08 13:28:56 · 6030 阅读 · 0 评论 -
ReentrantLock之lock和unlock方法
文章目录ReentrantLock类结构Sync类结构LOCK方法(非公平锁为例)UNLOCK方法其他方法tryLockReentrantLock类结构该类实现Lock接口。Lock接口定义了锁最基本的方法。该类的final成员变量Sync同步器,以静态内部类的形式提供了公平同步器和非公平同步器。(构造器提供选择是否公平,默认非公平。公平锁性能要劣于非公平锁)Sync类结构Sy...原创 2019-04-06 22:50:33 · 1655 阅读 · 0 评论