/**
* java 性能优化实践
* @JAVA 语言性能技术
* Collections
* Map
* MultiMap Google
* C++情况下动态内存是手动处理的,在程序员的控制之下显式管理对象生命周期,当对象被删除,析构就发生
* 资源的获取和释放直接和对象的生命周期相关
*
* Java的内存管理子系统是一个根据需要运行的垃圾收集器
* 在用于分配的可用内存耗尽时做出响应
*
* @方法句柄
* @invokedynamic 更灵活的确定在调用点要执行哪个方法?
* 直到运行时才能确定调用哪个方法
* 当调用点通过解释器到达时,回调用一个特殊的辅助方法,所谓的引导方法BSM ,BSM返回一个对象
* 该对象表示在这个调用点应该调用的实际方法,被称为调用目标,被加入到了这个调用点中
*
* 一个关键的概念是方法句柄(method handle)是一个对象,表示应该从invokedynamic调用点调用的方法
*
* @并发性能技术
* @JMM java 内存模型
* 试图处理的问题
* 当两个处理器核心访问相同的数据会发生什么?
* 什么时候能够保证他们看到的数据是相同的?
* 内存缓存对这些答案有什么影响?
* 做出的两个保证
* 与排序相关的保证
* 与跨线程更新的可见性相关的保证
* @强内存模型(strong memory model)
* 所有核心在任何时候看到的值总是相同的
* @弱内存模型 weak memory model
* 不同的核心可能看到不同的值
* 有特殊的缓存机制控制这种情况出现的时机
* @JMM的保证基于的主要概念
* @先行发生
* 一个事件确定在另一个事件之前发生
*
* @同步
* 事件将导致对象图与主内存同步
*
* @类串行
* 指令在执行线程之外看上去是按顺序执行的
*
* @先释放再获取
* 锁要先被某个线程释放,之后才可以被下一个线程获取
*
* @线程对对象的状态有自己的描述,它所做的任何改变都必须刷新到主内存中,然后由访问其他先相同数据的线程重新获取。
* @现在我们看java关键字——synchronized指的就是持有管程(monitor)的这个线程的本地视图已经和主内存同步(synchronized-with)
* synchronized 是保证数据跨多个线程的排序和可见性的一种机制。
*
* @同步的方法和块不仅定义了线程必须执行同步的接触点,还定义了一些代码块,这些代码块必须在其他同步的块或方法启动之前全部完成。
*
* @对于非同步访问,JMM没做出任何说明,在一个线程上所做的更改何时会对其他线程可见,没有任何保证。
*
* synchronized的局限性
* 同等对待已锁定对象上的所有synchronized操作
* 锁的获取和释放必须在一个方法的级别或一个方法内的synchronized块内完成
* 要么获取锁,要么线程被阻塞;如果无法获取锁,则无法尝试获取锁并继续执行处理。
*
* @线程之间的java同步是一种合作机制,一个不遵守则不能正常工作——苛刻的要求
*
* @构建并发库
* java提供的核心构建块——多线程
* 锁(lock)和信号量(semaphore)
* 原子(atomic)
* 阻塞队列(blocking queue)
* 锁存器(latch)
* 执行器(executor)
*/
图来源《java 性能优化实践》