随笔分类 -  JAVA

摘要:适配器模式可以将一个类的接口转换成客户希望的另外一个接口,使得原本由于接口不兼容而不能在一起工作的那些类可以一起工作。 适配器模式是一种对象结构型模式,这里的接口不仅仅是java语言中的interface,更多是指一个类型所具有的方法特征集合,是一种逻辑上的抽象。 客户端需要一个target(目标) 阅读全文
posted @ 2020-03-18 00:13 牛有肉 阅读(123) 评论(0) 推荐(0) 编辑
摘要:链表实现: /** * @Author Nxy * @Date 2019/12/4 * @Param * @Return * @Exception * @Description 链表并归排序 * 递归分解序列为两个子序列,并向上并归排序,返回排序后的总链表 * 使用快慢指针法,快指针到终点时慢指针指 阅读全文
posted @ 2020-03-16 00:22 牛有肉 阅读(186) 评论(0) 推荐(0) 编辑
摘要:池化是我们在实际生产中经常用到的一种思想,通过一个 “池” 把资源统一的管理起来。可以达到对资源的合理管理、重复利用、减少资源创建/销毁的开销等目的。 常见的比如常量池、连接池、线程池,今天我们手撸一个线程池。 抛开语言特性,线程池无非是维护一堆线程阻塞等待任务的到来,并由主线程对任务线程的数量进行 阅读全文
posted @ 2020-03-14 23:33 牛有肉 阅读(3657) 评论(0) 推荐(0) 编辑
摘要:kill 掉一个线程,感觉是一件很简单的事情,比如 JAVA 中为我们提供了 stop 方法可以立即终止线程的执行,达到 kill 掉线程的目的。 但实际上对线程的操作是一件精细活,对于一段正在执行的任务,我们不能只是简单粗暴的勒令其停止。原因就是,线程与资源是有关联的。 比如,一个线程持有某个 l 阅读全文
posted @ 2020-03-09 21:57 牛有肉 阅读(4020) 评论(0) 推荐(0) 编辑
摘要:看题目: 第一种解法采用绝对悲观锁保证绝对的线程安全,思路很简单:不考虑线程协作写代码,然后找出单线程环境下存在控制依赖与数据依赖且涉及共享变量的部分,保证其原子性后确定互斥关系,决定那些操作是互斥的,则共用一把锁。 class H2O { int hNums=0; int oNums=0; pub 阅读全文
posted @ 2020-03-09 00:04 牛有肉 阅读(350) 评论(0) 推荐(0) 编辑
摘要:先吐槽一下网上对原子性的解释,总是说原子性是不可分割的。 那只是在单核心下的语义,单核心下不可分割的操作意味着执行过程中不会有其它线程执行,从而导致变量污染,也就是原子性操作涉及的共享变量是安全的。 所以多线程下原子性的语义也应该是 :原子性操作涉及的共享变量是安全的,不会有其它线程修改。 也就是说 阅读全文
posted @ 2020-03-08 01:00 牛有肉 阅读(398) 评论(0) 推荐(0) 编辑
摘要:总结: 1. 如果在单线程环境下,几个操作共享变量的方法存在数据依赖关系,那么多线程环境下它们必须是一组原子操作,且与任何修改共享变量的方法互斥。与读方法是否互斥需要看程序的设计,比如 CopyOnWrite 模式下,这些原子操作不会与读共享变量的动作互斥,可以提高读的效率,但缺点是不能保证读操作每 阅读全文
posted @ 2020-03-05 19:48 牛有肉 阅读(349) 评论(0) 推荐(0) 编辑
摘要:写过 JAVA 并发代码的同学对 synchronized 关键字一定是熟的不能再熟了,其基于对象头部的 monitor 实现了对代码块的加锁,使一段代码变为线程不可重入的。 synchronized 与操作系统层的 lock 与 unlock 机制非常类似,多线程通过一个共享变量通信,这个共享变量 阅读全文
posted @ 2020-03-04 01:03 牛有肉 阅读(173) 评论(0) 推荐(0) 编辑
摘要:happen-before 可真是一个经典又老生常谈的话题,规则一共就八条,但看起来总有种抓不住重点的感觉。今天再整理一下对这八条规则的理解。 首先我的理解是 happen-before 的语义与在什么什么之前发生完全没有关系,其语义是如果 A hapen-bfore B,那么 A 的结果对 B 是 阅读全文
posted @ 2020-03-02 21:45 牛有肉 阅读(7149) 评论(2) 推荐(2) 编辑
摘要:数据一致性部分借用大神“耗叔”的博客:https://coolshell.cn/articles/20793.html。 总结:volatile 关键字通过内存屏障禁止了指令的重排序,并在单个核心中,强制数据的更新及时更新到缓存。在此基础上,依靠多核心处理器的缓存一致性协议等机制,保证了变量的可见性 阅读全文
posted @ 2020-03-02 19:00 牛有肉 阅读(3520) 评论(2) 推荐(2) 编辑
摘要:CPU 在运行时为了响应外部的请求,对外提供了一个中断引脚。CPU 在每个指令周期的最后一个晶振周期检查中断引脚,如果有中断任务,则立即停止手中的工作(当然要先保存现场)调用相应中断号的中断处理程序对中断做出响应。 进程在运行时为了响应外部请求,对外提供了信号队列。在每次由核心态转为用户态(比如由进 阅读全文
posted @ 2020-03-01 23:18 牛有肉 阅读(1037) 评论(0) 推荐(0) 编辑
摘要:https://i-beta.cnblogs.com/posts/edit;postId=12097856 上面的博客记录了异常控制流的原理,我们基于异常处理流,再来扒一下 JAVA 中的异常处理。 上篇博客中提过,异常的触发和处理是分层级的,总的来说,有以下几种(个人总结): 1. 由硬件触发,操 阅读全文
posted @ 2020-02-29 20:26 牛有肉 阅读(298) 评论(0) 推荐(0) 编辑
摘要:因为感觉对 B 树的理解不是特别深刻,一直想手撸一个 B 树,这次终于得偿所愿,文末有完整的 B 树代码。 代码比较长,大概六百行。 B 树的代码使用了一百组数据进行 插入/删除 测试,结果正确。 从生产讲,实现一棵 B 树不会有什么实际意义,但是这些代码和构建这些代码的思路,都将成为我们职业素养的 阅读全文
posted @ 2020-02-26 15:25 牛有肉 阅读(1808) 评论(2) 推荐(2) 编辑
摘要:KMP算法是目前应用非常广泛的一种字符串匹配算法,因为其代码量比较少,相较传统的解法又多了一个初学会比较陌生的辅助数组,所以在刚接触的情况下比较难以理解。 需要说明的是,kmp算法有非常多的改进或衍生版本,看每一个版本的说明时建议看到底再看其它版本,防止概念混淆。比如 next 数组的定义,某些版本 阅读全文
posted @ 2020-02-17 17:34 牛有肉 阅读(294) 评论(0) 推荐(0) 编辑
摘要:作为一个 JAVA 开发者,对注解这一概念一定是不陌生的。像我们平时常用的就有 @Controller, @Service,@Test,@Override 等等好多个,正确的使用注解确实可以方便我们的开发,以@Controller 为例,加上该注解后,框架层面为我们节省了一大堆需要在 Servlet 阅读全文
posted @ 2020-02-15 17:40 牛有肉 阅读(2227) 评论(0) 推荐(2) 编辑
摘要:理解一个数据结构,我们应该首先明白该数据结构的作用与应用场景,尔后理清其逻辑结构,基于逻辑结构考虑如何在计算机上进行物理存储,最后对以上进行代码实现。 我们按上述思考顺序来实现一次线段树。 作用及应用场景 我们考虑一个场景,我们有一个长度为 n 的数组,我们需要经常进行两种操作: 1. 计算某个区间 阅读全文
posted @ 2020-02-14 21:45 牛有肉 阅读(619) 评论(0) 推荐(0) 编辑
摘要:关于 λ 演算在这篇博客 λ表达式与邱奇数,JAVA lamda表达式实现 中做了一个初步的介绍,这次我们来看一些实际应用中的例子:闭包。闭包的知识点有很多,但核心概念就一个,从 λ 演算的角度看便是:自由变量的替换依赖于定义函数的上下文环境。也就是说上下文环境的改变会通过影响函数中的自由变量而直接 阅读全文
posted @ 2020-02-01 23:22 牛有肉 阅读(471) 评论(1) 推荐(1) 编辑
摘要:前言 学习 λ 演算的初衷是为了更好的使用 JAVA8 的 lamda表达式,但是在学习过程中发现 λ 演算的作用和深度远远比想象的大的多得多。λ 演算的定义并不复杂,包括一条变换规则(变量替换)和一条函数定义方式,但其外延却囊括和渗透到了无数方向,乃至学习过程中脑中不断冒出一句话:内涵越小、外延越 阅读全文
posted @ 2020-01-31 21:50 牛有肉 阅读(1237) 评论(0) 推荐(1) 编辑
摘要:题目: 关于动态规划类题目的思路如何找在上一篇博客 https://www.cnblogs.com/niuyourou/p/11964842.html 讲的非常清楚了,该博客也成为了了leetcode中戳气球题目点赞和阅读最多的题解(虽然题解本身就很少)。 本题的解题路径与上述博客一致,也是从 递归 阅读全文
posted @ 2019-12-22 00:40 牛有肉 阅读(225) 评论(0) 推荐(0) 编辑
摘要:内部类是JAVA语言的主要附加部分。内部类几乎可以处于一个类内部任何位置,可以与实例变量处于同一级,或处于方法之内,甚至是一个表达式的一部分。因为很少使用,一直对内部类的理解不够深入(暴露了基础不扎实)。最近在阅读AQS源码,发现了大量内部类的使用,so,为了通顺的阅读,决定把内部类搞清楚。 第一节 阅读全文
posted @ 2019-12-11 10:24 牛有肉 阅读(790) 评论(0) 推荐(1) 编辑