Lock的使用

  1. 通过ReentrantLock类,实例化接口Lock
  2. try catch前加锁
  3. try里写业务代码
  4. finally 解锁

Lock对比Synchronized

Lock

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

public class SaleTicketDemo_Lock {
    public static void main(String[] args) {
        //并发:多线程操作同一个资源类,把资源类丢入线程
        Ticket02 ticket = new Ticket02();

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

    }
}

//Lock
//卖票的方式
class Ticket02{
    //属性、方法
    private int number=300;
    //1.通过ReentrantLock类,实例化接口Lock
    Lock l =new ReentrantLock();
    
    public  void Sale(){
        l.lock();//2.加锁
        try {
            //3.业务代码
            if (number>0){
                System.out.println(Thread.currentThread().getName()+"卖出了第"+(number--)+"还剩"+(number)+"张");
            }
        } catch (Exception e) {
            e.printStackTrace();
        } finally {
            //4.解锁
            l.unlock();
        }
    }
}

Synchronized

public class SaleTicketDemo_Synchronized {
    public static void main(String[] args) {
        //并发:多线程操作同一个资源类,把资源类丢入线程
        Ticket ticket = new Ticket();

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

    }
}

//Synchronized
//资源类 OOP
class Ticket{
    //属性、方法
    private int number=300;

    //卖票的方式
    public synchronized void Sale(){
        if (number>0){
            System.out.println(Thread.currentThread().getName()+"卖出了一张票,还剩"+(number--)+"张");
        }
    }
}
  1. Synchronized 内置的java关键字,Lock是一个java接口;
  2. Synchronized 无法判断获取锁的状态,Lock 可以判断是否获取到了锁;
  3. Synchronized 会自动释放锁,Lock必须要手动释放锁,如果不释放锁,会死锁;
  4. Synchronized 线程1(获得锁,阻塞)、线程2(等待);Lock锁就不一定会等待下去;
  5. Synchronized 可重入锁,不可以中断的,非公平的;Lock。可重录所,可以判断锁,公平(可以自己设置);
  6. Synchronized 适合锁少量的代码同步问题,Lock适合锁大量的同步代码