放弃该放弃的是无奈,放弃不该放弃的是无能,不放弃该放弃的是无知,不放弃不该放弃的是执着。
愿自己能在自己所热爱的道路上越走越远。
和往常一样,每周五在CSDN上写自己的总结的时候都会随便看看CSDN上, 本周无意中看到了GEEK+博主大赛, 怀着尝试的心情,在这里展开自己对Java锁机制的探索. 如果有觉的不符合的,那么希望评委能指出来以供自己对自己理解的偏见的纠正.
Java高并发背后的锁机制
本文着重以JDK6版本之后的锁机制来进行阐述自己对锁机制的理解.
Java锁机制目前分为两种, 一种是通过Java关键字synchronized
实现的稍微重量级的锁, 还有一种就是JDK提供的在java.util.concurrent
包下各种锁工具类.
一、 synchronized关键字
在这里就对关键字synchronized
的使用方法就不做过多的介绍了, Java教科书上对该关键字的使用还是有的. 现在就着重说下自己对synchronized
的理解.
对Java多线程、高并发有了解的都应该知道,Java在JDK6对该synchronized
关键字进行了很大部分的优化, 使的该关键字使用的时候并没有像以前那么重量级. 而Java开发团队在对synchronized
优化的过程被称之为锁膨胀过程或者是锁的升级过程,还能说是锁的几种状态.那么基于我们应该先对锁的几种状态有一定的了解:
- 偏向锁:
在我们写的大部分并发程序中,锁不仅不存在多线程的竞争,而且总是由同一个线程获取到该锁,如果对这一个线程实施对总线加锁或者对缓存加锁将会导致性能大幅度的下降, 所以在这种情况下Java引用了偏向锁, 而偏向锁就是将那个锁对象的对象头的MarkWord使用CAS交换技术换成当前持有该锁的线程的线程ID,并且将偏向锁的标志状态设置为1,表示当前对象锁的状态为偏向锁, 以后只要有新的线程(也可能还是当前线程)尝试获取同一把对象锁的时候,
JUC包下的工具锁