Java公平锁和非公平锁

显示锁ReentrantLock()也是非公平锁

顾名思义就是在锁代码块的时候可以自己指定开始位置和结束位置不能被线程共享,非公平锁在线程进入就绪状态时是抢占式占有时间片的。如下:

public class Demo08 {
          
   
    public static void main(String[] args) {
          
   
        Runnable t = new Ticket();
        new Thread(t).start();
        new Thread(t).start();
        new Thread(t).start();
    }
static class Ticket implements Runnable{
          
   
        private int num = 10;
        private Lock l = new ReentrantLock();
        @Override
        public void run() {
          
   
            while (true){
          
   
                l.lock();
                if (num > 0){
          
   
                    try {
          
   
                        Thread.sleep(1000);
                    } catch (InterruptedException e) {
          
   
                        e.printStackTrace();
                    }
                    num--;
                    System.out.println(Thread.currentThread().getName()+"执行中"+num);
                }
                else {
          
   
                    return;
                }
                l.unlock();
            }
        }
    }
 }

运行结果如下: 定义了三个线程时间片都被线程0抢走了。

公平锁

ReentrantLock(true); 传入参数true就是公平锁了,时间片会按线程轮询,代码如下:

public class Demo08 {
          
   
    public static void main(String[] args) {
          
   
        Runnable t = new Ticket();
        new Thread(t).start();
        new Thread(t).start();
        new Thread(t).start();
    }
    static class Ticket implements Runnable{
          
   
        private int num = 10;
        private Lock l = new ReentrantLock(true);
        @Override
        public void run() {
          
   
            while (true){
          
   
                l.lock();
                if (num > 0){
          
   
                    try {
          
   
                        Thread.sleep(1000);
                    } catch (InterruptedException e) {
          
   
                        e.printStackTrace();
                    }
                    num--;
                    System.out.println(Thread.currentThread().getName()+"执行中"+num);
                }
                else {
          
   
                    return;
                }
                l.unlock();
            }
        }
    }
}

结果如下:

经验分享 程序员 微信小程序 职场和发展