JUC学习-1-JUC简介-Synchronized 和 Lock

 

 这就是JUC

 

传统的方法在多线程的情况下就会有并发的问题

 

public class SaleTicketDemo01 {
    public static void main(String[] args) {
        // 并发 多个线程操作同一个资源类 把资源丢入线程
        Ticket ticket = new Ticket();
        new Thread(() -> {
            for (int i = 0; i < 40; i++) {
                ticket.sale();
            }
        }, "A").start();
        new Thread(() -> {
            for (int i = 0; i < 40; i++) {
                ticket.sale();
            }
        }, "B").start();
        new Thread(() -> {
            for (int i = 0; i < 40; i++) {
                ticket.sale();
            }
        }, "C").start();
    }
}


//资源类
class Ticket {
    private int number = 30;
    private int orderNUmber = 0;

    // 买票的方式
    public void sale() {
        if (number > 0) {
            System.out.println(Thread.currentThread().getName() + "卖出了" + ++orderNUmber + "张票,剩余:" + --number);
        }
    }
}

 

 

 

最简单的方式 synchronized

 

//资源类
class Ticket {
    private int number = 30;
    private int orderNUmber = 0;

    // 买票的方式
    public synchronized void sale() {
        if (number > 0) {
            System.out.println(Thread.currentThread().getName() + "卖出了" + ++orderNUmber + "张票,剩余:" + --number);
        }
    }
}

 

 

 

 

 

Lock 加锁 锁分为三类

 

 

 

 

 

锁又分为公平锁和非公平锁,公平锁按照顺序排序,不可插队,非公平锁,按照cpu调度 Java默认是非公平锁

Synchronized 和Lock 的区别

Synchronized 是内置的Java关键字 Lock是一个Java类

Synchronized 无法判断获取锁的状态 lock可以判断是否获取到了锁

synchronized 会自动释放锁 lock必须要手动释放锁 如果不释放锁 (死锁)

synchronized 线程1(获得锁,阻塞) 线程2(等待,一直等待) Lock不一定会等待下去 (tryLock())

synchronized 可重入锁 不可以中断的 非公平锁 Lock 可重入锁 可以判断锁 非公平(可以设置)

synchronized 适合少量的代码同步问题  lock适合大量的同步代码

 

posted @ 2021-06-25 20:14  野兽Gentleman  阅读(76)  评论(0编辑  收藏  举报