两种synchronized:
实现synchronized的基础:
Java对象头和Monitor
对象再内存中的布局
对象头、实例数据、对齐填充
对象头的结构:synchronized放在了这里面
Mark Word:
Monitor:使得每个Java对象天生自带了一把看不见的锁
已取到还能再取到:重入
同步方法:是隐式的,判断ACC_SYNCHRONIZED标志位
类似与while(true),,而不是sleep(1000);,sleep放弃了cpu
自适应呢,就是上次很简单很轻松的获取到锁了,给出的自旋次数就多,反之。
轻量级锁的加锁过程:
解锁过程:
safe和unsafe类了解一下
线程间的通信必须通过主内存完成
上面这行代码不符合Happens-before规则,所以不是线程安全的
修改办法:给value声明volatile,或对这两个方法加上synchronized锁,使其满足了 2 3条件:
虽然加上了volatile,但是value++并不是原子性的,仍会有线程不安全
boolean的赋值是原子性的,线程安全
单例模式经典,,下面仍是线程不安全的:
给 instance加上volatile 禁止了 2 3 的指令重排
CAS乐观锁:
value++可以用这个实现乐观锁:
失败了会不断的循环重试
缺点:
Java线程池:
使用Executor创建线程:
Thread t = new Thread();
executor.execute(t); 而不是t.start();了
状态转换图: