Java集合-ArrayList
参考文献
Collection - ArrayList 源码解析
死磕 java集合之ArrayList源码分析
ArrayList-JDK8
属性
123456789101112131415161718192021222324252627282930313233343536373839404142/** * 该常量代表ArrayList默认的初始化容量,实际上这个值在ArrAyList中的使用非常少 * 只出现在ArrayList第一次确认容量的时候——而且还是在默认情况下 * Default initial capacity. */ private static final int DEFAULT_CAPACITY = 10; /** * 该常量值是在ArrayList初始化的时候使用,用来将elementData数组赋值为一个没有元素的空数组。 * 注意:只是在初始化时使用 * 空数组,用于空实例的共享空数组实例(若传入的容量为0时使用). * Shared empty array instance used for emp ...
Java并发编程(九)-并发工具类简介
参考文献
Java并发编程的艺术
CountDownLatch
CyclicBarrier
Java并发编程入门(十五)CyclicBarrier应用场景
并发工具类
提供了比synchronized更加高级的各种同步结构,包括CountDownLatch、CyclicBarrier、Semaphore等,可以实现更加丰富的多线程操作,比如利用Semaphore作为资源控制器,限制同时进行工作的线程数量.
各种线程安全的容器,比如最常见的ConcurrentHashMap、有序的ConcunrrentSkipListMap,或者通过类似快照机制,实现线程安全的动态数组CopyOnWriteArrayList等.
各种并发队列实现,如各种BlockedQueue实现,比较典型的ArrayBlockingQueue、SynchorousQueue或针对特定场景的PriorityBlockingQueue等.
强大的Executor框架,可以创建各种不同类型的线程池,调度任务运行等,绝大部分情况下,不再需要自己从头实现线程池和任务调度器.
CountDownLatch(等待多个线程 ...
JVM(八)-异常处理
参考文献
极客时间-JVM是如何处理异常的?
异常处理
异常处理的两大组成要素是抛出异常和捕获异常.这两大要素共同实现程序控制流的非正常转移.
抛出异常可分为显式和隐式两种.显式抛异常的主体是应用程序,它指的是在程序中使用throw关键字,手动将异常实例抛出.
隐式抛异常的主体则是 Java 虚拟机,它指的是 Java 虚拟机在执行过程中,碰到无法继续执行的异常状态,自动抛出异常.举例来说,Java 虚拟机在执行读取数组操作时,发现输入的索引值是负数,故而抛出数组索引越界异常(ArrayIndexOutOfBoundsException).
捕获异常则涉及了如下三种代码块:
try 代码块:用来标记需要进行异常监控的代码.
catch 代码块:跟在 try 代码块之后,用来捕获在 try 代码块中触发的某种指定类型的异常.除了声明所捕获异常的类型之外,catch 代码块还定义了针对该异常类型的异常处理器.在 Java 中,try 代码块后面可以跟着多个 catch 代码块,来捕获不同类型的异常.Java 虚拟机会从上至下匹配异常处理器.因此,前面的 catch 代码块所捕获的异 ...
JVM(七)-静态绑定和动态绑定
参考文献
极客时间-JVM是如何执行方法调用的?(上)
静态绑定和动态绑定
静态绑定: 所有依赖静态类型来定位方法执行版本的分派方式.如: 重载方法.
静态绑定(也称为早期绑定)是指在编译时进行的方法绑定.在静态绑定中,方法调用的具体实现在编译时已经确定,因此它是基于引用类型而不是基于运行时对象类型的.这意味着,如果调用的方法是在父类中定义的,则不管实际运行时类型是什么,该方法都将被调用.
动态绑定: 根据运行的时机类型来定位方法执行版本的分派方式.如: 重写方法.
动态绑定(也称为晚期绑定或运行时绑定)是指在运行时进行的方法绑定.在动态绑定中,方法调用的具体实现是在运行时根据实际对象类型确定的,因此它是基于运行时对象类型的.
Java 虚拟机识别方法的关键在于类名,方法名以及方法描述符(method descriptor).
方法描述符: 它是由方法的参数类型以及返回类型所构成.在同一个类中,如果同时出现多个名字相同且描述符也相同的方法,那么 Java 虚拟机会在类的验证阶段报错.
Java 虚拟机中关于方法重写的判定同样基于方法描述符.也就是说,如果 ...
JVM-线程堆栈等数据分析
参考文献
JVM线程模型
线程创建和销毁
在语言层面,线程对应的类是java.lang.Thread,启动方法为Thread#start()。
在Java线程启动时会创建底层线程(native Thread,在任务执行完成后会自动回收。
JVM中所有线程都交给操作系统来负责调度,以将线程分配到可用的 CPU 上执行
线程状态
从 JVM的角度看,线程状态主要包括 4 种:
_thread_new:正在初始化的新线程
_thread_in_Java:正在执行 Java 代码的线程
_thread_in_vm:在 JVM 内部执行的线程
_thread_blocked:由于某种原因被阻塞的线程(例如获取锁、等待条件、休眠、执行阻塞的 I/O 操作等等)
JVM内部线程
JVM 内部线程主要分为以下几种:
VM 线程: 单例的VMThread对象,负责执行 VM 操作,下文将对此进行讨论;
定时任务线程: 单例的WatcherThread对象,模拟在 VM 中执行定时操作的计时器中断;
GC 线程: 垃圾收集器中,用于支持并行和并发垃圾回收的线程;
编译器线程: 将字节码 ...
JVM-参数设置说明
参考文献
Guide to the Most Important JVM Parameters
Java HotSpot VM Options
Tuning JVM Garbage Collection for Production Deployments
Convert GC Logging Flags to Xlog
The java Command
JVM GC配置指南
Java容器化参数配置最佳实践
JVM参数说明
123java [options] classname [args]java [options] -jar filename [args]
[options] 部分称为JVM 选项,对应 IDE 中的 VM options, 可用 jps -v 查看.
[args] 部分是指传给main函数的参数, 对应 IDE 中的 Program arguments, 可用 jps -m 查看.
Java 和 JDK 内置的工具,指定参数时都是一个 -,不管是长参数还是短参数.有时候,JVM 启动参数和 Java 程序启动参数,并没必 ...
Java-Mail操作
参考文献
邮件基本概念及发送方式
RFC1869文档
RFC2821文档
邮件的基本概念
邮件服务器
邮件服务器是一种用来负责电子邮件收发管理的设备,同时也是电子邮件系统中的核心内容.
邮件服务器是有发送邮件SMTP服务器和接收邮件POP3服务器协同工作,并且为用户提供接收邮件的功能.
邮件服务器比一般的免费邮箱更加安全,一直被企业公司使用.
电子邮箱
电子邮箱也称为E-mail地址,比如xx@qq.com、xx@163.com。用户能通过E-mail地址标识自己发送的电子邮件,同时也可以通过这个地址接收别人发来的电子邮件。
电子邮箱需要到邮件服务器进行申请,也就是说,电子邮箱其实就是用户在邮件服务器上申请的账户。邮件服务器会把接收到的邮件保存到为该账户所分配的邮箱空间中,用户通过用户名密码登录到邮件服务器查收该地址已经收到的邮件。一般来讲,邮件服务器为用户分配的邮箱空间是有限的。
邮件客户端
邮件客户端就是我们平常在上面进行邮件发送的网站或者应用,比如常见的FoxMail、雷鸟、outlook、163、mesign等;
通常使用IMAP/APOP/POP3/SMTP协议 ...
Java并发源码分析-AbstractQueuedSynchronizer源码分析
参考文献
万字超强图文讲解AQS以及ReentrantLock应用(建议收藏)
<<Java并发编程艺术>>
AbstractQueuedSynchronizer
队列同步器,简称同步器或AQS
AQS可重写的方法
方法名称
方法描述
protected boolean tryAcquire(int arg)
独占式获取同步状态
protected boolean tryRelease(int arg)
独占式释放同步状态
protected int tryAcquireShared(int arg)
共享式获取同步状态返回值>=0表示获取成功,反之获取失败
protected boolean tryReleaseShared(int arg)
共享式释放同步状态
protected boolean isHeldExclusively()
当前同步器是否在独占模式下被线程使用,一般该方法表示是否被当前线程独占.
同步状态指的是有volatile修饰的state变量,涉及的相关方法
方法名称
方法描述 ...
Java并发编程(七)-Java内存模型(JMM)
参考文献
<<Java并发编程艺术>>
<<深入理解Java虚拟机-JVM高级特性与最佳实践>>
JSR 133 (Java Memory Model) FAQ
The Java Memory Model
【死磕Java并发】-----Java内存模型之happens-before
The JSR-133 Cookbook for Compiler Writers
Java内存模型(JMM)
The Java memory model describes how threads in the Java programming language interact through memory. Together with the description of single-threaded execution of code, the memory model provides the semantics of the Java programming language. --Wikipedia
Java内存模型描述了Java编程 ...
Java并发编程(六)-Java并发机制的底层实现原理-原子操作
参考文献
<<Java并发编程艺术>>
<<Java语言规范-基于Java SE 8>>
原子操作的实现原理
在Java中可以通过锁和循环CAS的方式来实现原子操作;
使用循环CAS实现原子操作
JVM中CAS操作是利用处理器提供的CMPXCHG指令实现的.自旋CAS实现的基本思路就是循环进行CAS操作直到成功为止.
1234for(;;){ int i = atomicI.get(); boolean sunc= atomicI.compareAndSet(i,i++);}
CAS实现原子操作的三大问题
ABA问题
因为CAS需要在操作值的时候,检查值有没有发生变化,如果没有发生变化则更新,但是如果一个值原来是A,变成了B,又变成了A,那么使用CAS进行检查时就会发现它的值没有发生变化,但是实际上变化了.
ABA问题的解决思路就是用版本号.在变量前面追加版本号,每次变量更新的时候把版本号加1,那么由原来的A->B->A变成了1A->2B->3A.
从JDK5开始 ...