实战小知识----02.09----Java杂谈(四)

80 阅读2分钟

这是我参与2022首次更文挑战的第17天,活动详情查看:2022首次更文挑战

本篇主要介绍一些基础杂谈,包括二叉树以及显示锁

排序二叉树

所谓的排序二叉树,也就是左节点比根节点小,右节点比根节点大;但是基本的排序二叉树并不能保持树的平衡,有可能会导致极端的情况发生 —— 不断加入节点,最终退化成链表。而链表的遍历查询效率相对低下。
这也就诞生了平衡二叉树——AVL。每次put数据的时候都会自平衡,通过旋转最终达成平衡一致性。
而红黑树,与AVL相似,但是并不追求高度一致性,降低了维持树平衡所需要的的开销,整体效果更好。

显式锁的park与yield区别

  • LockSupport.park方法不同于Thread.yield
  • park方法会直接放弃CPU资源,自己进入waiting状态。直到被其他线程调用unpark方法为止
  • yield是让出自己的CPU,致使自己进入就绪状态,与其他线程重新竞争资源

CopyOnWriteArrayList

  • CopyOnWriteArrayList主要的应用场景是读多写少的地方;
  • 因为每次写操作都需要重新new一个数组出来并复制数据;牺牲了写操作来优化读操作
  • 读写分离,读操作与写操作不影响
  • 最终一致性,因为对于数组用了volatile修饰,保证可见性(保证读操作在写操作之后);同样的对于别的线程就无法读到实时的数据

线程安全

保证线程安全有两种思路,一种是锁,使用synchronized或者Reentrant-Lock;另一种是循环CAS;然而写时复制则体现了另一种思路,类似Java内存模型的工作内存和主内存一样。通过复制资源减少冲突,对于绝大部分访问都是读,且有大量并发线程要求读,只有个别线程进行写,且只是偶尔写的场合,写时复制就是一种很好的解决方案。