Thread.sleep():当前线程睡眠多少毫秒,让给其他线程去执行。
Thread.yield():当前线程退出一下,进入到等待队列,让其他线程执行,即让出线程一下。
Thread.join():等待另外一个线程的结束。
见com.hanxiaozhang.threadbase1ndedition.synchronizedkeyword.No5SynchReentrant
见com.hanxiaozhang.threadbase1ndedition.synchronizedkeyword.No6SynchExceptionRelease
见com.hanxiaozhang.threadbase1ndedition.synchronizedkeyword.No3SynchLineUp
锁定某个对象o,如果o的属性发生变化,不影响锁的使用,但是如果o变成另一个对象,则锁定的对象发生改变,应该避免锁定对象的引用变成另外的对象。--> 解决:加final
前提:基于HotSpot实现的JVM。
无锁状态、偏向锁状态、轻量级锁状态、重量级锁状态。
适应性自旋锁、锁消除、偏向锁、锁粗化、偏向锁



访问标识(access flags):ACC_SYNCHRONIZED
monitorenter指令 monitorexitr指令
C++ 调用了操作系统提供的同步机制
X86系统 : lock cmpxchg / xxx
https://blog.csdn.net/21aspnet/article/details/88571740
见com.hanxiaozhang.threadbase1ndedition.synchronizedkeyword.No1NonThreadSafe
模拟银行账号:对业务写方法加锁,对业务读方法不加锁,这样行不行? -> 容易产生脏读(dirtyRead)
见com.hanxiaozhang.threadbase1ndedition.synchronizedkeyword.No2DirtyRead
可以
见com.hanxiaozhang.threadbase1ndedition.synchronizedkeyword.No4SynchAndNonSynchMethod
普通方法同步范围是该方法,是给对象上锁;静态方法同步范围是该方法,是给Class类上锁,这个类所有的对象竞争一把锁。
锁:
执行时间短(加锁代码),线程数少,用自旋锁
执行时间长,线程数多,用系统锁(重量级锁)
见com.hanxiaozhang.threadbase1ndedition.no2volatilekeyword.No1VolatileVisibility
见com.hanxiaozhang.threadbase1ndedition.no2volatilekeyword.No2VolatileDisOrder
增加访问标识(access flags): ACC_VOLATILE

volatile内存区的读写都加屏障

使用hsdis(HotSpot Dis Assembler)工具观察,windows是由lock 指令实现 | MESI实现
https://blog.csdn.net/qq_26222859/article/details/52235930
Tips:
对象初始化过程,分为三步,可能会发生重排序

CAS(CompareAndSwap)中文意思:比较并替换,它是一种无锁算法。CAS有3个操作数:内存地址V,旧的预期值A,即将要更新的目标值B。
CAS指令执行时,当且仅当V的值与A相等时,将V修改为B,否则就什么都不做,整个CAS操作是一个原子操作。

CAS是原子操作,CAS具有关键字volatile读和写的内存语义。
