关于synchronized和ReentrantLock的理解
作为俩个同步锁,synchronized的实现是在jvm,我们不需要手动去释放锁,jvm会替我们做好,原理大概是:jvm在执行到有synchronized关键字的方法的时候,会判断synchronized指向的对象锁里有没有锁定某一个线程,如果没有则锁定,有的话,会把该线程阻塞,并把该线程添加到等待队列,等到锁定线程执行完之后,随机选一个等待队列里的线程执行(因为有的线程很早就添加到等待队列里面了,所以随机选择对他们来说是不公平的,因此是不公平锁)。如果调用了object.wait,则该线程会释放掉锁并会被jvm添加到阻塞队列,等调用了object.notify之后jvm会将该阻塞线程重新添加到等待线程等待cpu的临幸。调用NotifyAll之后,阻塞队列里面的所有线程都获得了cpu再次执行的机会,那么是哪个线程执行呢?执行的语句会从重新获取锁开始吗?应该是这些被重新唤起的线程会再次竞争锁,竞争到的线程从wait之后的语句开始执行。
ReentrantLock的实现是在jdk,需要手动去释放锁,原理和synchronized差不多,调用ReentrantLock.lock之后,依旧会创建等待队列和阻塞队列,不同的是,可以通过condition创建不同的阻塞队列,这样,可以通过condition的await和signal来控制不同的阻塞队列,更加灵活一点。且ReentrantLock可以实现公平锁,内部维护了一个线程添加到等待序列的顺序,因此,可以按照顺序来接受cpu的临幸,因此比较公平。
目前暂时理解到这里,记录一下