垃圾回收机制会自动触发对内存,对不需要的内存进行释放
本地方法的调用,JVM允许java直接调用本地方法
每个线程的私有空间,jvm会为每个java线程创建pc寄存器
负责执行虚拟机的字节码
1.可见性
2.原子性
3.有序性
垃圾回收机制会自动触发对内存,对不需要的内存进行释放
对象分为三类:年轻代,年老代、持久代
JVM将堆分为三个空间:Eden、Survivor(2个,一个使用一个空)、Old
GC:Minor GC(清理年轻代)、 Major GC(清理老年代)、 Full GC(清理年轻代、老年代)
创建模式
被sychronized修饰的代码块同一时间只能被一条线程访问
sychronized修饰的代码段 具有原子特性、可见性特性、有序性
sychronized
volatile被这个关键词修饰的变量具有synchronized 的可见性特性,但是不具备原子特性,volatile也有禁止指令重排的作用。
当对被volatile修饰的变量就行修改的时候,会讲工作空间中的数值拷贝到主存中,并且通知其他线程,该变量的值发生了改变。
当多个线程对volatile修饰的变量进行自加加操作时,其结果会和应获取结果发生偏差。
对volatile修饰的变量进行自加加时,其过程是 三个部分:
在第三步通知其他其他线程中,其他线程的可能已经也在执行第三步,最终导致操作发生丢失
解决多线程下并发问题的工具
只有它被释放,其它线程才可以使用
sychronized就是悲观锁
每次不加锁而假设没有冲突去完成操作,操作失败则重试
CAS就是一个乐观锁
CAS 全称Compare and swap
CAS是java中rt里的一个unsafe类的方法,具有原子性(CPU直接操作不会被打断)。
Compare and swap 先比较版本,版本相同再交换 (可以解决volatile的没有原子性的特点)
例子 AtomicInteger 类对象, object.decrementAndGet(),object.decrementAndGet()。
CAS缺点:
ABA问题
指的是CAS比较版本的时候 出现了相同版本的不同时间的出现。导致整个事件中间发生发生了其它改变
解决ABA问题的方案:使用时间戳
可重复锁的特点:对一个线程对象已经获取某个对象的锁,再次加锁不会出现死锁
Synchronized关键词可是可重复锁,可直接使用
ReentrantLock类也是一个可重复锁
但是需要手动上锁和解锁Lock和unLock。
(Synchronized需要指定被锁的对象,ReentrantLock是被锁的对象本身)
既一个类对外只有一个对象
特征:
private static myObject instance=new myObject ();
Public static myObject getinstance(){
return instance;
}
public enum myObject{
INSTANCE;
}
private static myObject instance;
Public static myObject getinstance(){
If(instance==null)instance=new myObject ();
return instance;
}
private static myObject instance;
Public static myObject getinstance(){
Synchronized(myObject .class){
If(instance==null)instance=new myObject ();
}
return instance;
}
private static myObject instance;
Public static myObject getinstance(){
If(instance!=null)return instance;
Synchronized(myObject .class){
If(instance==null)instance=new myObject ();
}
return instance;
}
/*
可能出错原因:编译器代码重排导致创建实例对象的时候
instance指向不为null,而instance里的内容尚未初始化。
*/
private static volatile myObject instance;
Public static myObject getinstance(){
If(instance!=null)return instance;
Synchronized(myObject .class){
If(instance==null)instance=new myObject ();
}
return instance;
}
//避免代码重排带来的问题
Private static Sinleton{
private static myObject instence=new myObject();
}
Public static myObject getinstance(){
Return Sinleton.instance;
}
加载-》链接(验证,准备,解析)-》初始化
java运行时环境的一部分,负责将java类动态的加载jvm的内存空间中(按需加载)
双亲委托机制要求除顶层类加载器外,其余的加载器都应有自己的父类加载器。
双亲委托机制中的父子关系并非继承,二手采用组合关系来复用父类加载器的相关代码。
先检查是否装载,如果已经装载则直接返回。
委托类加载到父类,父类能够完成则返回父类加载器加载的Class实例。