0%

CountDownLatch

CountDownLatch底层是使用AQS实现的。

使用AQS的状态变量来存放计数器的值。首先在初始化CountDownLatch时设置状态值(计数器值),当多个线程调用countdown方法时实际是原子性递减AQS的状态值。

当线程调用await方法后当前线程会被放入AQS的阻塞队列等待计数器为0再返回。

其他线程调用countdown方法让计数器值递减1,当计数器值变为0时,当前线程还要调用AQS的doReleaseShared方法来激活由于调用await()方法而被阻塞的线程。

阅读全文 »

LookSupport工具类

JDK中的 rt.jar 包里面的 LockSupport 是个工具类,它的主要作用是挂起和唤醒线程该工具类是创建锁和其他同步类的基础

阅读全文 »

线程

线程创建与运行

创建线程的三种方式:

  1. 继承Thread类,重写run方法
  2. 通过Runable接口创建线程类
  3. 通过Callable和FutureTask创建线程
阅读全文 »

java内存模型

Java内存模型用来屏蔽各种硬件和操作系统的内存访问差异,以实现让Java程序在各种平台上都能达到一致的内存访问效果

阅读全文 »

synchronized

synchronized关键字解决的是多个线程之间访问资源的同步性,synchronized关键字可以保证被它修饰的方法或者代码块在任意时刻只能有一个线程执行。

在 Java 早期版本中,synchronized属于重量级锁,效率低下,因为监视器锁(monitor)是依赖于底层的操作系统的 Mutex Lock 来实现的,Java 的线程是映射到操作系统的原生线程之上的。如果要挂起或者唤醒一个线程,都需要操作系统帮忙完成,而操作系统实现线程之间的切换时需要从用户态转换到内核态,这个状态之间的转换需要相对比较长的时间,时间成本相对较高,这也是为什么早期的 synchronized 效率低的原因。

庆幸的是在 Java 6 之后 Java 官方对从 JVM 层面对synchronized 较大优化,所以现在的 synchronized 锁效率也优化得很不错了。JDK1.6对锁的实现引入了大量的优化,如自旋锁、适应性自旋锁、锁消除、锁粗化、偏向锁、轻量级锁等技术来减少锁操作的开销。

阅读全文 »

虚拟机类加载机制

类加载的时机

类的生命周期包括:加载、验证、准备、解析、初始化、使用和卸载7个阶段。其中验证、准备、解析三个部分统称为连接

加载、验证、准备、初始化和卸载这五个阶段顺序是确定的,类加载过程必须按这个顺序开始,但是不一定按顺序完成,他们通常是相互交叉混合地进行的。

阅读全文 »

JDK的命令工具

jps:虚拟机进程状况工具

命令格式:

jps [options] [hostid]

jps 工具主要选项

选项 作用
-q 只输出LVMID 省略主类名称
-m 输出虚拟机经常启动时传递给主类main() 函数的参数
-l 输出主类的全名
-v 输出虚拟机进程启动时JVM参数

jps还可以通过RMI协议查询开启了RMI服务的远程虚拟机进程状态。hostid为RMI注册表中注册的主机名。

阅读全文 »