java线程安全和同步锁介绍
1. 自旋锁,共享数据锁定一般只有一小会,为了这一小会去挂起和唤醒线程不值得,因此一般采用自旋操作进行等待。
2. 锁消除,编译期间发现不可能产生数据竞争,进行锁消除。主要是逃逸分析,所有的堆上的数据对象都不会被其他线程访问,可以当做栈上数据操作对待。
3. 锁粗化,锁如果出现在循环块中可以只加一次锁。
4. 轻量级锁,相对于使用操作系统中互斥量来实现的传统锁,传统锁就是重量级锁。如果同步对象锁定,虚拟机将首先在当前线程的栈帧中建立一个锁记录空间,用于存储对象目前markword的拷贝,然后虚拟机通过cas操作尝试设置对象markword锁标志位,此时处于轻量级锁。如果更新操作失败,先检查线程锁记录空间查看是否有当前锁,有进入执行,无说明对象被其他线程锁定。