java 多线程 - Lock 锁 - ReentrantLock 重入锁

上接:

说明

ReentrantLock 重入锁,指的是同一线程 外层函数获得锁之后 ,内层递归函数仍然有获取该锁的代码,但不受影响。

例子

用 ReentrantLock 解决卖票的问题

package ReentrantLock;

import java.util.concurrent.locks.Lock;
import java.util.concurrent.locks.ReentrantLock;

public class 卖票_有锁 implements Runnable {
    Lock lock = new ReentrantLock();
    public final int COUNT=100;
    private int ticket=1;
    @Override
    public void run() {
        while(ticket<=COUNT){
            lock.lock(); // 获取锁
            if(ticket > COUNT){
                break;
            }
            System.out.println(Thread.currentThread().getName()+"-售出票号:"+ticket);
            ticket++;
            try {
                Thread.sleep(100);
            } catch (InterruptedException e) {
                e.printStackTrace();
            }
            lock.unlock();// 释放锁
        }
    }

    public static void main(String[] args) {
        卖票_有锁 ri=new 卖票_有锁();
        Thread t1=new Thread(ri,"窗口1");
        Thread t2=new Thread(ri,"窗口2");
        t1.start();
        t2.start();
    }
}

执行结果

窗口1-售出票号:82
窗口1-售出票号:83
窗口1-售出票号:84
窗口1-售出票号:85
窗口2-售出票号:86
窗口2-售出票号:87
窗口2-售出票号:88
窗口2-售出票号:89
窗口2-售出票号:90
窗口2-售出票号:91

不会多卖票,也不会重复卖票


原文出处:/show_1IX4rq6tAPGG.html