15、lock锁

1、lock是显示锁,手动开启和关闭,synchronized是隐式锁,出了作用域自动释放。

2、lock只有代码块锁,synchronized有代码锁和方法锁

3、使用lock锁,jvm将花费较少的时间来调度线程,性能更好,并且具有更好的扩展性,提供更多的子类。

4、优先使用顺序:lock》同步代码块》(已经进入了方法体,分配了相应资源)》同步方法(在方法之外)

package com.syn;
import java.util.concurrent.locks.ReentrantLock;
public class LockBuyTickets {
    public static void main(String[] args) {
        BuyTickets buyer = new BuyTickets();
        new Thread(buyer,"daliwang").start();
        new Thread(buyer,"xiaoliwang").start();
        new Thread(buyer,"zhongliwang").start();
    }
}
class BuyTickets implements Runnable{
    //票
    private int ticketsNum = 10;
    private final ReentrantLock lock = new ReentrantLock();//定义锁
    //循环标志
    boolean flag = true;
    //重写run方法
    @Override
    public void run() {
        //买票
        while(flag){
            try{
                lock.lock();
                buy();
            }finally {
                lock.unlock();
            }
        }
    }
    //判断是否有票,增加同步锁
    public synchronized void buy(){
        if(ticketsNum<=0){
            flag=false;//设置停止标志
            return;
        }
        try {
            Thread.sleep(1000);
        } catch (InterruptedException e) {
            e.printStackTrace();
        }
        System.out.println(Thread.currentThread().getName()+"拿到"+ticketsNum--);
    }
}

  

posted @ 2022-07-24 16:45  颓废且努力奋斗的人  阅读(255)  评论(0编辑  收藏  举报