24 lock锁

发布时间 2023-09-08 15:33:12作者: 被占用的小海海

package ThreadDemo;
//多个线程同时操作同一个对象,涉及到资源的独享与共享并发什么的
// 多个线程同时操作同一个对象,可能会出现问题:线程不安全,数据紊乱    ------>上锁
// 并发与同步
  // 火车票例子

import java.util.concurrent.locks.ReentrantLock;

// synchronized 锁住的是 操作者对象; synchronized 块 锁住的是 某个属性
public class Test20_Synchronized implements Runnable{
    // 定义可重入锁
    private final ReentrantLock lock =new ReentrantLock();
    boolean flag=true;
    int ticketNums=10;
    @Override
    public  void run() {
        while (flag){
            try {
                Thread.sleep(500);
            } catch (InterruptedException e) {
                throw new RuntimeException(e);
            }
            buy();
        }
    }

    private  void buy()  {   // synchronized 关键字,加锁 同步。 lock()差不多

        if (ticketNums<=0){
            flag=false;
            return;
        }else {
            try {
                lock.lock();  // 锁住
                System.out.println(Thread.currentThread().getName()+"--->抢到了第"+ ticketNums-- +"张票");
                // Thread.currentThread().getName() :获得线程体的名字
            }finally {
                lock.unlock();  // 解锁
            }
        }

    }

    public static void main(String[] args) {
        // 多个线程同时操作同一个对象,可能会出现问题------>上锁


        Test20_Synchronized ticket = new Test20_Synchronized();
        new Thread(ticket,"学生").start();  // 名为 学生线程体
        new Thread(ticket,"老师").start();  // 老师线程体
        new Thread(ticket,"黄牛").start();  // 黄牛线程体
    }
}