Lock锁

HeJin大约 2 分钟JavaJUC并发编程

Lock接口

image-20210311115754304
image-20210311115754304

Lock接口的实现类

All Known Implementing Classes:
// 可重入锁(常用)
ReentrantLock, 
// 读锁
ReentrantReadWriteLock.ReadLock, 
// 写锁
ReentrantReadWriteLock.WriteLock

ReentrantLock

image-20210311120305880
image-20210311120305880

公平锁:十分公平,可以先来后到。

非公平锁:十分不公平,可以插队。(默认)

1、new ReentrantLock()

2、加锁

3、解锁

public class SafeTicketDemo2 {
    public static void main(String[] args) {
        // 把资源类丢入线程
        Ticket2 ticket = new Ticket2();

        new Thread(() -> {
            for (int i = 0; i < 40; i++) {
                ticket.sale();
            }
        }, "A").start();
        new Thread(() -> {
            for (int i = 0; i < 40; i++) {
                ticket.sale();
            }
        }, "B").start();
        new Thread(() -> {
            for (int i = 0; i < 40; i++) {
                ticket.sale();
            }
        }, "C").start();

    }
}

/**
 * 资源类 OOP编程
 */
class Ticket2{
    private int num = 30;

    /** 1、new ReentrantLock() **/
    Lock lock = new ReentrantLock();

    /**
     * synchronized本质:队列 + 锁
     */
    public void sale(){
        // 2、加锁
        lock.lock();
        try {
            // 业务代码
            if (num > 0){
                System.out.println(Thread.currentThread().getName()+"卖出了第"+num--+"张票,剩余:"+num);
            }
        } catch (Exception e){
            e.printStackTrace();
        } finally {
            // 3、解锁
            lock.unlock();
        }
    }
}

结果:

A卖出了第30张票,剩余:29
A卖出了第29张票,剩余:28
A卖出了第28张票,剩余:27
A卖出了第27张票,剩余:26
A卖出了第26张票,剩余:25
A卖出了第25张票,剩余:24
A卖出了第24张票,剩余:23
A卖出了第23张票,剩余:22
C卖出了第22张票,剩余:21
C卖出了第21张票,剩余:20
C卖出了第20张票,剩余:19
C卖出了第19张票,剩余:18
C卖出了第18张票,剩余:17
C卖出了第17张票,剩余:16
C卖出了第16张票,剩余:15
C卖出了第15张票,剩余:14
C卖出了第14张票,剩余:13
C卖出了第13张票,剩余:12
C卖出了第12张票,剩余:11
C卖出了第11张票,剩余:10
C卖出了第10张票,剩余:9
C卖出了第9张票,剩余:8
C卖出了第8张票,剩余:7
C卖出了第7张票,剩余:6
C卖出了第6张票,剩余:5
C卖出了第5张票,剩余:4
C卖出了第4张票,剩余:3
C卖出了第3张票,剩余:2
C卖出了第2张票,剩余:1
C卖出了第1张票,剩余:0

Process finished with exit code 0