java里面的公平锁和非公平锁

java里面的线程加锁机制有两种方式,一种是使用synchronize关键字修饰代码块或者方法,另外一种是jdk1.5以后在juc包下实现的lock锁机制,本文讨论的主要是juc包下面的重入锁ReentrantLock.

实现方式:

  • 公平锁:

Lock lock = new ReentrantLock (true);

  • 非公平锁
    Lock lock = new ReentrantLock ();

公平锁和非公平锁的特点:

公平锁是指多个线程在等待同一个锁时,必须按照申请锁的先后顺序来一次获得锁。

公平锁的好处是等待锁的线程不会饿死,但是整体效率相对低一些;非公平锁的好处是整体效率相对高一些,但是有些线程可能会饿死或者说很早就在等待锁,但要等很久才会获得锁。其中的原因是公平锁是严格按照请求所的顺序来排队获得锁的,而非公平锁时可以抢占的,即如果在某个时刻有线程需要获取锁,而这个时候刚好锁可用,那么这个线程会直接抢占,而这时阻塞在等待队列的线程则不会被唤醒;

公平锁:

FairSync,就是当前资源被加锁后,其他所有请求线程按照请求的先后顺序搁置到queue中,当锁被释放放掉,然后严格的按照先进先出的原则一个一个加锁。
就比如生活中去超市购物后买单,只有一个收银台,这个收银台也只能服务一个顾客。当买单的人特别多的时候,大家就需要按照先来后到排队买单。

非公平锁:

NonfairSync 非公平的意思就是管你三七二十一,我先尝试给共享资源加锁,如果加锁成功就阻塞其他线程(因为其他线程都在队列中排队,这个时候就特别的霸道而显得不公平),如果是共享资源上已经被加锁了,这个时候还要再判断下能不能加锁,两次尝试加锁都失败再霸道也没用了,就只能老老实实去队列尾部排队!
还是去超市购物后买单,只有一个收银台,这个收银台也只能服务一个顾客。当买单的人特别多,大家都排着队等着。这个时候来了个壮汉,仗着自己高大枉顾排队的游戏规则,直接跑到收银台看有没有人正在买单,如果没有人正在买单就直接插队买单。如果看了两眼还是有人正在买单,那就规规矩矩到队尾排队。

参考文章:https://blog.csdn.net/weixin_43142697/article/details/88827131
参考文章:https://blog.csdn.net/u013256816/article/details/51204385

发布了39 篇原创文章 · 获赞 1 · 访问量 4620

猜你喜欢

转载自blog.csdn.net/thetimelyrain/article/details/100984865