Lock 锁

Lock锁(重点)

传统的synchronized

/**
 * 基本买票例子
 * 线程就是一个单独的资源类,没有任何附属的操作
 * 1、属性、方法
 */
public class SaleTicketDemo01 {
    public static void main(String[] args) {
        //并发:多线程操作同一个资源类,把资源类丢入线程
        Ticket ticket = new Ticket();
        //@FunctionalInterface函数式接口,jdk1.8之后lambda表达式(参数)->{代码}
        new Thread(()->{
            for (int i = 1; i < 60; i++) {
                ticket.sale();
            }
        },"A").start();


        new Thread(()->{
            for (int i = 1; i < 60; i++) {
                ticket.sale();
            }
        },"B").start();

        new Thread(()->{
            for (int i = 1; i < 60; i++) {
                ticket.sale();
            }
        },"C").start();
    }

}

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

    //买票的方式
    //synchronized:本质,队列,锁
    //锁对象和class
    public synchronized void sale() {
        if (number > 0) {
            System.out.println(Thread.currentThread().getName() + "卖出了第" + number-- + "张票,剩余:"+number);
        }
    }
}

Lock 接口

JUC 编程

JUC 编程

JUC 编程

公平锁:十分公平:先来后到
非公平锁:十分不公平:可以插队(默认)有时会先执行在后的执行时间少的。
public class SaleTicketDemo02 {
    public static void main(String[] args) {
        Ticket2 ticket2 = new Ticket2();
        new Thread(()->{
            for (int i = 1;i < 40; i++) ticket2.sale();
        },"A").start();

        new Thread(()->{
            for (int i = 1;i < 40; i++) ticket2.sale();
        },"B").start();

        new Thread(()->{
            for (int i = 1;i < 40; i++) ticket2.sale();
        },"C").start();
    }
}


//资源类
//Lock
class Ticket2 {
    private int number = 30;

    Lock lock = new ReentrantLock();

    public void sale() {

        lock.lock();//加锁

        try {
            //业务代码
            if (number > 0) {
                System.out.println(Thread.currentThread().getName() + "卖出了第" + number-- + "张票,剩余:"+number);
            }

        } catch (Exception e) {

        } finally {
            lock.unlock();
        }

    }
}

Synchronized 和 Lock 区别

1、Synchronized 是内置的Java关键字,Lock是一个Java类
2、Synchronized 无法判断获取锁的状态,Lock 可以判断是否获取到了锁
3、Synchronized 会自动释放锁,Lock 必须要手动释放锁!如果不释放锁,会死锁
4、Synchronized 线程1(获得锁,阻塞)、线程2(等待,傻傻的等待);Lock锁就不一定会等待下去。
5、Synchronized 可重入锁(可重入就是说某个线程已经获得某个锁,可以再次获取锁而不会出现死锁),不可以中断的,非公平。Lock,可重入锁,可以判断锁,非公平(可以自设置)。
6、Synchronized 适合少量的代码同步问题,Lock适合锁大量的同步代码!

锁是什么,如何判断锁的是谁

本作品采用《CC 协议》,转载必须注明作者和本文链接
讨论数量: 0
(= ̄ω ̄=)··· 暂无内容!

请勿发布不友善或者负能量的内容。与人为善,比聪明更重要!