# 排队锁

这里给出一个排队锁的实现和使用Demo

好处:

较于普通自旋锁,可以实现公平性

坏处:

与普通自旋锁一样,自旋时需要CPU参与,消耗大
package com.mrzhang.javalearn.bingfa.demo_05;

import java.util.concurrent.TimeUnit;
import java.util.concurrent.atomic.AtomicInteger;

/**
 * 排队锁的简单实现(一)
 *
 * @author 91MrZhang on 2020/8/15
 */
public class TicketLock {
    private AtomicInteger completeCtn = new AtomicInteger(0);
    private AtomicInteger totalCnt = new AtomicInteger(0);


    public void lock() {
        //先拿到自己的ticket号,并且通知前台总数+1
        Integer myTicket = totalCnt.getAndIncrement();
        //如果完成数量等于自己的ticket号,那就锁上
        while(myTicket != completeCtn.get()) {

        }

    }

    public void unlock() {
        completeCtn.incrementAndGet();
    }

    // 测试方法
    public void m() {
        String tName = Thread.currentThread().getName();
        lock();
        for (int i = 0; i < 10; i++) {
            try {
                TimeUnit.SECONDS.sleep(1);
            } catch (InterruptedException e) {
                e.printStackTrace();
            }
            System.out.println(tName + "->心跳第" + (i + 1) + "次");
        }
        unlock();
    }

    public static void main(String[] args) {
        TicketLock ticketLock = new TicketLock();
        new Thread(ticketLock::m, "线程1号").start();
        new Thread(ticketLock::m, "线程2号").start();
        new Thread(ticketLock::m, "线程3号").start();
    }
}