美文网首页
java多线程锁

java多线程锁

作者: arkliu | 来源:发表于2022-12-13 09:00 被阅读0次

多线程回顾

线程状态

public enum State {
        //新生
        NEW,
        //运行
        RUNNABLE,
        //阻塞
        BLOCKED,
        // 等待
        WAITING,
        // 超时等待
        TIMED_WAITING,
        // 终止
        TERMINATED;
    }

wait和sleep的区别

  1. 来自不同的类
    wait 来自Object
    sleep 来自Thread

  2. 关于锁的释放
    wait会释放锁,sleep不会释放锁

  3. 使用的范围不同
    wait 必须在同步代码块中
    sleep 可以在任何地方睡

  4. 需要捕获异常
    wait 不需要捕获异常
    sleep 必须要捕获异常

传统的synchronized锁

public class ThreadTest {

    public static void main(String[] args) {
        SaleTicket saleTicket = new SaleTicket();
        new Thread(()->{for(int i=0; i < 40; i++) {saleTicket.sale();}},"线程1").start();
        new Thread(()->{for(int i=0; i < 40; i++) {saleTicket.sale();}},"线程2").start();
        new Thread(()->{for(int i=0; i < 40; i++) {saleTicket.sale();}},"线程3").start();
    }
    

    static class SaleTicket {
        private int num = 30;
        
        public synchronized void sale() {
            if (num > 0) {
                System.out.println("线程:"+Thread.currentThread().getName()+" 售出了:"+(num--)+"张票  还剩"+num+"张");
            }
        }
    }
}

Lock锁

Lock锁使用

private Lock mLock = new ReentrantLock();  // 1. 创建lock对象
mLock.lock();  //2. 执行业务代码前,先lock
try {
     //业务代码
    if (num > 0) {
        System.out.println("线程:"+Thread.currentThread().getName()+" 售出了:"+(num--)+"张票  还剩"+num+"张");
    }
} catch (Exception e) {
    e.printStackTrace();
} finally {
    mLock.unlock();  // 3.执行完业务代码后,unlock
}
static class SaleTicket {
    private int num = 30;
    private Lock mLock = new ReentrantLock();
    public void sale() {
        mLock.lock();
        try {
            if (num > 0) {
                System.out.println("线程:"+Thread.currentThread().getName()+" 售出了:"+(num--)+"张票  还剩"+num+"张");
            }
        } catch (Exception e) {
            e.printStackTrace();
        } finally {
            mLock.unlock();
        }
    }
}

synchronized和lock的区别

  1. synchronized是java内置的关键字,Lock是java类
  2. synchronized无法判断获取锁的状态,Lock可以判断是否获取到了锁
  3. synchronized会自动释放,Lock必须要手动解锁

相关文章

网友评论

      本文标题:java多线程锁

      本文链接:https://www.haomeiwen.com/subject/vepytdtx.html