java中的锁怎么用?到底是什么?实现原理是什么?

1.Java中锁怎么用?

        Java中有两大类使用锁的方式,一种为使用synchronized关键字,另一种为利用JDK中的类例如ReentrantLock。使用synchronized关键字可以修饰方法或者代码块,分别称之为同步方法或者同步代码块。具体用法随便一搜就可以找到,此处不再赘述。

2.Java中的锁到底是什么?

        一句话来说,锁就是一个类似于队列的数据结构(比单纯的队列要复杂一些)。再具体一点就是,当有多个线程并发访问对象时,如果对象已经被其他线程锁定,那么当前线程会有一个入队的操作。

3.锁的实现原理是什么?

        2中已经提到了,锁简单来说可以理解为一个类似队列的数据结构,当你使用synchronized的时候,本质上是在JVM中实现了这个数据结构。既然是JVM来实现,那可知这种锁本质是用C来写的,直接看这部分源码还是有些难度的。

        为了便于理解,我们可以先来看一下ReentrantLock的实现原理。ReentrantLock使用了AQS类,而AQS就是2中所描述的类似于队列的数据结构。如果想要彻底理解此处,不亲自debug到AQS的源码中,对于一个初学者来说几乎不可能彻底理解。

        所以如果你是一个初学者,想要了解JDK中的锁是如何实现的,原理如何,这里可以提供几个关键字供大家自己学习,并且推荐两本书籍《深入理解Java虚拟机》,《HotSpot实战》:

1)ReentrantLock

2)AQS

3)LockSupport.park()

4)LockSupport.unpark()

5)CLH队列

        如果想要彻底搞懂synchronized的原理,也建议读者网上搜下如下关键字:

1)jvm monitor

2)对象头

        其实对于锁,网上的文章非常多,但是能讲清楚的,讲准确的却很少,有些东西差之毫厘谬以千里,所以本文更加倾向于为读者彻底搞懂锁的实现原理提供相应的学习资料和方法,《深入理解Java虚拟机》这里描述了一个通用的JVM规范相关的知识,好多地方描述的还是有些含糊不清,从准确度来说,《HotSpot实战》会表达的更加准确,而且非常清晰易懂。后续有时间我会一点点细化相关知识点,也欢迎大家有问题的话随时交流。

你可能感兴趣的:(java基础)