您的位置:首页 > 其它

公平锁与非公平锁

2017-07-19 08:48 225 查看

公平锁与非公平锁

        锁Lock分为公平锁与非公平锁。公平锁是表示线程获取锁的顺序是按照线程加锁的顺序来分配的,即先来先得的FIFO先进先出顺序。而非公平锁就是一种获取锁的抢占机制,是随机获取锁的,和公平锁不一样的就是先来的不一定先得到锁,这个方式可能造成某些线程拿不到锁,结果也就是不公平的了。

    新建Service.java :

package service;

 

importjava.util.concurrent.locks.ReentrantLock;

 

public class Service {

 

         privateReentrantLock lock;

 

         publicService(boolean isFair) {

                   super();

                   lock= new ReentrantLock(isFair);

         }

 

         publicvoid serviceMethod() {

                   try{

                            lock.lock();

                            System.out.println("ThreadName="+ Thread.currentThread().getName()

                                               +"获得锁定");

                   }finally {

                            lock.unlock();

                   }

         }

 

}

新建RunFair.java :

package test.run;

 

import service.Service;

 

public class RunFair {

 

         publicstatic void main(String[] args) throws InterruptedException {

                   finalService service = new Service(true);

 

                   Runnablerunnable = new Runnable() {

                            @Override

                            publicvoid run() {

                                     System.out.println("★线程" + Thread.currentThread().getName()

                                                        +"运行了");

                                     service.serviceMethod();

                            }

                   };

 

                   Thread[]threadArray = new Thread[10];

                   for(int i = 0; i < 10; i++) {

                            threadArray[i]= new Thread(runnable);

                   }

                   for(int i = 0; i < 10; i++) {

                            threadArray[i].start();

                   }

 

         }

}

    运行结果:

   


   打印结果基本是有序的,这就是公平锁的特点。

   新建RunNotFair.java:

package test.run;

 

import service.Service;

 

public class RunNotFair {

 

         publicstatic void main(String[] args) throws InterruptedException {

                   finalService service = new Service(false);

 

                   Runnablerunnable = new Runnable() {

                            @Override

                            publicvoid run() {

                                     System.out.println("★线程" + Thread.currentThread().getName()

                                                        +"运行了");

                                     service.serviceMethod();

                            }

                   };

 

                   Thread[]threadArray = new Thread[10];

                   for(int i = 0; i < 10; i++) {

                            threadArray[i]= new Thread(runnable);

                   }

                   for(int i = 0; i < 10; i++) {

                            threadArray[i].start();

                   }

 

         }

}

    运行结果为:



    非公平锁的运行结果基本上是乱序的,说明先start()启动的线程不代表先获得锁。

 

 

 

 

 

 

 

 
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息