设为首页 - 加入收藏 ASP站长网(Aspzz.Cn)- 科技、建站、经验、云计算、5G、大数据,站长网!
热搜: 重新 试卷 创业者
当前位置: 首页 > 运营中心 > 建站资源 > 优化 > 正文

Java中各种锁让人头大,我想要用这篇文章让你思绪清晰(2)

发布时间:2019-09-23 20:34 所属栏目:21 来源:java架构coid
导读:ReentrantLock默认就是非公平的锁,我们来看一下公平锁的例子: 公平锁 看一下输出结果: 输出结果 我们可以看到公平锁的输出结果是按照顺序来的,先到先得。 在看一下非公平锁的例子: 非公平锁的例子 输出结果:

ReentrantLock默认就是非公平的锁,我们来看一下公平锁的例子:

Java中各种锁让人头大,我想要用这篇文章让你思绪清晰

公平锁

看一下输出结果:

Java中各种锁让人头大,我想要用这篇文章让你思绪清晰

输出结果

我们可以看到公平锁的输出结果是按照顺序来的,先到先得。

在看一下非公平锁的例子:

Java中各种锁让人头大,我想要用这篇文章让你思绪清晰

非公平锁的例子

输出结果:

Java中各种锁让人头大,我想要用这篇文章让你思绪清晰

输出结果

我们可以看到如果使用非公平锁的话最后输出的结果是完全没有顺序的,先到不一定先得。

所以在使用公平锁的时候线程1获取到锁之后线程2在请求锁的话就会挂起等待线程1释放锁,然后线程2才能获取锁。如果再有一个线程3想要请求锁的话,这时候如果使用的是非公平锁,那么线程2和线程3中两个有一个会获取到锁,公平锁的情况下线程3只能先挂起,等待线程2获取锁资源释放后在获取。

什么时候使用公平锁和非公平锁

在需要公平资源的场景下使用公平锁,如果不需要特殊的公平对待的话尽量使用非公平锁,因为公平锁会带来性能的开销。

独占锁和共享锁

看到独占和共享会联想到什么,对的独占锁就是每次只有一个线程能霸占这个锁资源,而其他线程就只能等待当前获取锁资源的线程释放锁才能再次获取锁,刚刚上面的ReentrantLock就是独占锁,那这样看来独占锁不也就是悲观锁吗?因为悲观锁抢占资源后就只能等待释放其他线程才能再次获取到锁资源。其实准确的说独占锁也是悲观锁。

在谈共享锁,共享锁其实也是乐观锁它放宽了锁的策略允许多个线程同时获取锁。在并发包中ReadWriteLock就是一个典型的共享锁。它允许一个资源可以被多个读操作访问,或者被一个 写操作访问,但两者不能同时进行。

自旋锁

什么是自旋锁,自旋锁其实就是当一个线程获取锁的时候,这个锁已经被其他人获取到了那么这个线程不会立马挂起,反而在不放弃CPU使用权的情况下会尝试再次获取锁资源,默认次数是10次,可以使用-XX: PreBlockSpinsh来设置次数。如果自旋锁获取锁的时间太长,会造成后面的线程CPU资源耗尽释放。并且自旋锁是不公平的。

优点

自旋锁不会使线程状态发生切换,一直处于用户态,即线程一直都是active的;不会使线程进入阻塞状态,减少了不必要的上下文切换,执行速度快。

(编辑:ASP站长网)

网友评论
推荐文章
    热点阅读