并发编程(2)- Synchronize优化字
本篇将介绍Synchronize关键字,Synchronize的优化,偏向锁、轻量级锁等。
由于某些数据存在共享性,在多线程情况下,多线程对同一条数据同时进行修改会造成结果的不确定性,为了保证结果的确定性,则需要控制在多线程修改共享数据的时候,对数据进行锁定,数据修改完成后再释放锁,这时其他的线程可以对改共享数据进行修改,这体现了资源访问的互斥性。在资源被某个线程占用之后,直到该线程释放锁,整个过程体现了数据操作的原子性(加锁到释放锁的过程是一个整体操作,在执行过程中不允许被其他线程中断)。另外一个特性就是可见性,这个在上一章volatile的时候已经解释过。简单说就是一个共享变量在被一个线程修改之后,其他线程也应该能发现变量的变化。
jdk1.6之前Synchronize的实现同步时通过内部监视器来实现的,这个监视器的实现依赖于操作系统的Mutex(操作系统课肯定有讲过的)来实现。Mutex是操作系统维度的也就意味着在进行加锁解锁的操作需要操作系统来实现,需要更多的状态转换开销以及等待时间。这也是JDK1.6之前Synchronize十分笨重的原因,为了提高性能,引入了“偏向锁”、“轻量级锁”,“自旋锁”等,下面直接从锁的膨胀过程介绍它们。
java中将锁的信息存在对象头中,对象头中存储了对象哈希码、分代年龄、锁标志位等信息。下图中展示了对象头的数据结构。
对象头的数据结构中包含了对各种锁的标志位以