ARTS-WEEK-015

Algorithm:

94: Binary Tree Inorder Traversal

530: Minimum Absolute Difference in BST

使用递归实现二叉树的前中后序遍历非常容易,进阶要求使用循环则麻烦一些,手动操作栈需要注意逻辑组织,官方题解更为简洁但是更难理解,需要多加练习;此外还有 Morris Traversal 方法,可以做到 O(1)空间,重点是几条规则,1左右子节点分支,2左节点分支中,找到中序遍历中的前序节点p(排除当前节点),将其指向当前节点,继续分支,3如果p.right不是空说明是第二次遍历到,进行清除和输出,否则继续操作下一个节点,作为一种多条规则的算法需要多加练习和记忆。

Review:

MEASURING TIME: FROM JAVA TO KERNEL AND BACK

LockSupport.parkNanos() Under the Hood and the Curious Case of Parking

这两篇文章都是一个名为 Jaromir Hamala 的人写的,同样的风格:因为一些疑问,深入分析JDK源码、glibc直到内核源码。在这个过程中展示了各层调用逻辑、系统调用、内核实现,最终发掘到内核层面问题,即第一篇的 Xen 虚拟时钟问题和第二篇的高精度时钟参数问题。在这个过程中还提供了一系列 perf 工具示例,很值得参考和学习。

Tip:

Java并发编程的艺术 - 第5章 Java中的锁

Java中的锁(包括各类Lock、Condition、CountDownLatch等相关组件)是如何实现的?Java 提倡的面相对象与封装抽象,好的类库设计让使用和实现分离,即使经常使用的 Api,也很容易对其如何实现却所知甚少。

Java 并发类库中提供了一个叫队列同步器 AbstractQueuedSynchronizer 的组件,帮助实现锁和其他同步组件,一方面 AQS 使用一个int变量表示同步状态、一个FIFO队列完成线程排队、condition队列实现不同条件的线程排队。另一方面 AQS 使用模板方法模式,并提供了 getState、setState、compareAndSetState 等操作方法,使用者继承 AQS 后重写 tryAquire 和 tryRelease 非阻塞逻辑,AQS 完成排队和唤起操作,可以大大简化正确实现锁的难度。

在实现不同类型的锁时,面临不同需求,比如独占式获取、共享式获取、独占和共享混合(读写锁用高低位使用一个state)、重入锁(定义state增加和减少)、公平锁(非公平支持快速尝试提高性能,公平锁则必须进入队列排队)、超时获取(增加parkNanos)等等。

相比于不理解前的神秘感,AQS 源码底层技术无外乎 volatile 的内存屏障和可见性保证、CAS 结合 SPIN 自旋实现原子操作、park 和 interrupt 实现的等待和唤醒。

Share:

Why You Can't FOCUS - And How To Fix That

重点:

  1. 集中注意力到一件事,不要同时处理多件事
  2. 主动避免分心和打断,即时临时中断也需要上下文切换
  3. 照顾好身体,睡眠、锻炼、营养、缺水都直接影响注意力
  4. 锻炼集中注意力技能,从少到多持续练习
  5. 习惯的力量,比如每天早起集中一小时等,不要等待有动力、一切都安排好再尝试专注,用习惯自动化,而番茄时间也是一种习惯化工具
  6. 休息和减少刺激,比如用散步、冥想等代替视频和资讯的刺激,后者会持续消耗精神能量
posted @ 2020-10-26 08:38  Jeff_p  阅读(86)  评论(0编辑  收藏  举报