多线程的安全问题
多线程在操作共享变量的时候就有可能引发数据不一致的问题.
解决线程安全的办法
使用锁
锁的实质
锁对象的头部使用两个字节用来记录该对象是否已经锁上了
锁的分类
任何的对象都可以作为锁
在使用synchronized代码块的时候通常使用this作为锁传递,此时锁就是当前的类对象
在使用非静态同步方法时,此时使用的锁也是当前类对象作为锁
在使用静态同步方法时,使用的锁是当前类对象的字节码对象为锁.
synchronized升级过程
偏向锁—实际上此时并没有锁,只是记录了当前访问线程的线程id,并假定以后不会再有别的线程访问资源了.
自旋锁—是用户态的操作,每次操作数据都是进行自旋,compareAndSet的操作.
系统锁—调用操作系统内核获取到的锁,效率是比较低的.
锁的可重入性
重入性指的是同一条线程可以再次获取之前同一个锁的资源
锁与异常
程序中如果出现了异常,默认情况下锁会被释放,锁被释放了也就会造成多条线程乱入的情况,导致数据不一致.
volatile的用途
共享变量内存可见性
防止指令重排序
注意的是:volatile不能保证数据的原子性.



