回顾java锁

  之前一直对锁的知识半知半解,写篇博客巩固下。

  1、悲观锁、乐观锁

      悲观锁每次操作都会加锁,会造成线程堵塞。而乐观锁则是假设不会冲突,每次操作都不会加锁。所以相较而言,乐观锁比较适合于竞争较少的场景,悲观锁比较适合竞争严重的情况。

      2、公平锁、非公平锁

      如果多个线程按照申请锁的顺序来获取锁,则是公平锁。举个例子:如果线程A获取锁,这时候B线程来请求该锁的持有权,会被挂起等待。等待的过程中,C线程也来竞争该锁,如果是非公平锁的情况,就会存在B、C线程同时竞争获取锁。可想而知,公平锁会带来更多的性能开销,所以没有特殊场景一般就用非公平锁就可以。

     3、可重入锁

     同一线程外层函数获取锁之后,内层函数依赖可以获取该锁。ReentranceLock、Sychronized都是可重入锁。

     4、共享锁、排他锁

     排他锁模式下,每次只能有一个线程持有锁。共享锁则允许多个线程同时获取锁。ReentrantReadWriteLock提供了读写锁实现,适用于读多写少的场景。

     5、自旋锁

      一个线程在获取锁的时候,如果锁已被其他线程获取,那么该线程将不断尝试获取,直到其他线程释放锁就可以立即获得锁,避免了用户线程和内核切换。但是线程如果一直无法获取锁,且处于活跃状态,没有执行有效的任务就会导致cpu空转。

     6、偏向锁→轻量级锁→重量级锁

     偏向锁:不存在线程竞争的情况下,只有一个线程访问同步资源

     轻量级锁:偏向锁遇到其他线程抢占锁时,会升级为轻量级锁,没有获取到锁的线程会以自旋的方式等待锁释放

     重量级锁:当轻量级锁被自旋到一定次数还没被获取到,就会升级为重量级锁,此时其他线程就会堵塞。

     

    

      

       

猜你喜欢

转载自www.cnblogs.com/fengyingdong/p/11437483.html