一.公平锁与非公平锁概念:
锁Lock分为"公平锁"和"非公平锁",公平锁表示线程获取锁的顺序是按照线程加锁的顺序分配的,即先来先得的FIFO先进先出的顺序,而非公平锁就是一个获取锁的抢占机制,是随机获得锁的,和公平锁不一样的就是先来的不一定先得到锁,这个当时可能造成某些线程一直拿不到锁,结果也就是不公平的了。
二.创建一个类,在构造中初始化ReentrantLock类,并传入boolean类型的参数,true表示公平,false表示非公平:
复制代码
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18public class Service { private ReentrantLock lock; public Service(Boolean fair){ super(); lock = new ReentrantLock(fair); } public void serviceMethod(){ try{ lock.lock(); System.out.println("ThreadName: "+Thread.currentThread().getName()+"获得锁定"); }finally { lock.unlock(); } } }
三.测试公平锁:
1.demo演示:
复制代码
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24public class FairLock { public static void main(String[] args) { /** * true表示公平锁 */ final Service service = new Service(true); Runnable runnable = new Runnable(){ @Override public void run() { System.out.println("★★★线程:"+Thread.currentThread().getName()+"运行了"); service.serviceMethod(); } }; Thread[] thread = new Thread[10]; for (int i=0;i<10;i++){ thread[i] = new Thread(runnable); } for(int i=0;i<10;i++){ thread[i].start(); } } }
2.测试结果:
3.解释:
打印结果基本是呈有序的状态,这就是公平锁的特点。
四.测试非公平锁:
1.demo演示:
复制代码
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23public class UnfairLock { public static void main(String[] args) { final Service service = new Service(false); Runnable runnable = new Runnable() { @Override public void run() { System.out.println("★★★线程:"+Thread.currentThread().getName()+"运行了"); service.serviceMethod(); } }; Thread[] threads = new Thread[10]; for (int i=0; i<10; i++){ threads[i] = new Thread(runnable); } for(int i=0; i<10; i++){ threads[i].start(); } } } /** * 并且说明先start启动的线程不代表先获得锁 */
2.测试结果:
3.解释:
非公平锁的运行结果基本上是乱序的,说明先start()启动的线程不代表先获得锁。
最后
以上就是无心鸡最近收集整理的关于多线程中的公平锁和非公平锁的全部内容,更多相关多线程中内容请搜索靠谱客的其他文章。
本图文内容来源于网友提供,作为学习参考使用,或来自网络收集整理,版权属于原作者所有。
发表评论 取消回复