JVM垃圾收集器
垃圾收集器 1. 串行回收器 串行收集器仅仅使用单线程进行垃圾回收,它是独占式的垃圾回收。垃圾回收时,应用程序所有线程停止工作,进行等待,即Stop-The-World 使用-XX:…
原子操作就是对访问同一个状态的所有操作(包括操作本身)来说,这个操作是以一个原子方式执行的操作。
AtomicXXX: CAS,Unsafe.compareAndSwapInt
AtomicLong: 低并发,准确数值要用
LongAddr: 将AtomicLong拆分,在统计时如果有并发更新,可能会导致误差,高并发时,优先使用。
compareAndSet
AtomicReference AtomicReferenceFieldUpdater
AtomicStampReference:CAS的ABA问题
每个Java对象都可以用作一个实现同步的锁,这些锁被称为内置锁(Intrinsic Lock)或监视器锁(Monitor Lock)。线程在进入同步代码块的之前会自动获得锁,并且在退出同步代码块时会自动释放锁,无论是正常退出还是发生异常退出都会自动释放锁。获得锁的唯一途径就是进入由这个锁保护的同步代码块或方法。
内置锁是可重入的,因此一个线程试图请求一个已经由它获得的锁的时候,那么这个请求是会成功的。重入是实现方法是:为每个锁关联一个获取计数值和一个所有者线程。子类改写父类的Synchronized方法,由于锁是可以重入的,避免了死锁的发生。
导致共享变量在线程间不可见的原因
通过加入内存屏障和禁止重排序优化来实现
使用volatile依赖于两个条件:
volatile适合做状态标记量
volatile boolean inited=false;
//线程1
context=loadContext();
inited=true;
// 线程2
while (!inited) {
sleep();
}
doSomethingWithConfig(context);
Java内存模型中,允许编译器和处理器对指令进行重排序,但是重排序过程不会影响到单线程程序的执行,会影响到多线程并发执行的正确性。
unlock
操作先行发生于后面对的lock
操作,后面指时间上的先后顺序。start()
方法。interrupt()
方法的调用。可以通过Thread.interrupted()
方法检测到是否有中断发生。Thread.join()
方法结束,Thread.isAlive()
的返回值手段检测到线程以及终止执行。如果两个线程的执行次序无法从8个happens-before操作中推导出来,那么虚拟机将无法保证两个线程有序性,虚拟机可以随意对他们进行重排序
垃圾收集器 1. 串行回收器 串行收集器仅仅使用单线程进行垃圾回收,它是独占式的垃圾回收。垃圾回收时,应用程序所有线程停止工作,进行等待,即Stop-The-World 使用-XX:…
快速排序及相关问题 1. 快速排序基础版 package com.liuyao.sort; import com.liuyao.…