---公平锁,非公平锁,可重入锁,递归锁,自旋锁
主题列表:juejin, github, smartblue, cyanosis, channing-cyan, fancy, hydrogen, condensed-night-purple, greenwillow, v-green, vue-pro, healer-readable, mk-cute, jzman, geek-black, awesome-green, qklhk-chocolate
贡献主题:github.com/xitu/juejin…
theme: juejin highlight:
公平锁|非公平锁 并发包中ReentrantLock创建指定构造函数的boolean类型来得到公平锁还是非公平锁,默认是非公平锁。
公平锁和非公平锁的差异? 公平锁是指多个线程按照申请锁的顺序来获取锁。 非公平锁是指多个线程获取锁的时候,获取锁的顺序并不是按照申请获取锁的顺序,有可能后申请的线程优先获取锁,在高并发的情况下,也可能会造成优先级反转或饥饿现象。
两者区别: 公平锁:就是讲究公平,每个线程获取锁时,会先查看此锁维护的队列。如果为空,当前线程是等待队列的第一个就占有锁,否则就会加入到等待队列中,后续会按照FIFO的规则从队列中获取。
非公平锁:比较粗鲁,上来就直接尝试占有锁,如果失败,就再采用类似公平锁的机制。这种方式性能好。(synchronized也是一种非公平锁)
可重入锁(又名递归锁) 指的是同一线程外层函数获得锁之后,内存递归函数仍然能获取该锁的代码。在同一个线程外层获取锁的时候,在进入内层方法会自动获取锁。也就是说,线程可以进入到任何一个它已经拥有的锁的所同步的代码块。 ReentrantLock/synchronized就是典型的可重入锁。可重入锁最大的作用就是避免死锁。
自旋锁 是指尝试获取锁的线程不会立即阻塞,而是采用循环的方式去尝试获取锁,这样的好处是减少线程上下切换的消耗,缺点是循环或消耗CPU。 自旋好处:循环比较获取直到成功为止,没有wait阻塞。