JUC-买票问题_无锁_Synchronized_Lock锁

宝藏UP主狂神说JAVA笔记

卖票问题不加锁

public class TicketSaleDemo_1 {

    public static void main(String[] args) {
        // 并发:多线程操作同一共享资源
        Ticket ticket = new Ticket();

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

// 资源类  OOP
class Ticket {
    // 属性 方法
    private int num = 30;

    public void sale() {
        if (num > 0) {
            System.out.println(Thread.currentThread().getName() + "还剩" + num--);
        }
    }
}

A还剩30
A还剩29
A还剩27
B还剩28
B还剩25
B还剩24
B还剩23
B还剩22
B还剩21
B还剩20
A还剩26
A还剩18
A还剩17
A还剩15
A还剩14
A还剩13
A还剩12
A还剩11
A还剩10
A还剩9
A还剩8
A还剩7
A还剩6
A还剩5
A还剩4
A还剩3
B还剩19
B还剩1
A还剩2
C还剩16

卖票问题加Synchronized锁

public class TicketSaleDemo_2 {

    public static void main(String[] args) {
        // 并发:多线程操作同一共享资源
        Ticket2 ticket2 = new Ticket2();

        new Thread(() -> {for (int i = 0; i < 50; i++) ticket2.sale();}, "A").start();
        new Thread(() -> {for (int i = 0; i < 50; i++) ticket2.sale();}, "B").start();
        new Thread(() -> {for (int i = 0; i < 50; i++) ticket2.sale();}, "C").start();
    }
}

class Ticket2 {
    // 属性 方法
    private int num = 30;

    public synchronized void sale() {
        if(num > 0) {
            System.out.println(Thread.currentThread().getName() + "还剩" + num--);
        }
    }
}

A还剩30
A还剩29
A还剩28
A还剩27
B还剩26
B还剩25
B还剩24
A还剩23
A还剩22
A还剩21
A还剩20
A还剩19
A还剩18
A还剩17
A还剩16
A还剩15
A还剩14
A还剩13
A还剩12
A还剩11
A还剩10
A还剩9
A还剩8
A还剩7
A还剩6
A还剩5
A还剩4
A还剩3
A还剩2
A还剩1

卖票问题加Lock锁

// Lock三部曲
// 1.创造锁 new ReentrantLock();
// 2.加锁 lock.lock();
// 3. finally 释放锁 lock.unlock();

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

public class TicketSaleDemo_3 {

    public static void main(String[] args) {
        Ticket3 ticket3 = new Ticket3();
        new Thread(() -> {for (int i = 0; i < 50; i++) ticket3.sale();}, "A").start();
        new Thread(() -> {for (int i = 0; i < 50; i++) ticket3.sale();}, "B").start();
        new Thread(() -> {for (int i = 0; i < 50; i++) ticket3.sale();}, "C").start();
    }

}

// Lock三部曲
// 1.创造锁 new ReentrantLock();
// 2.加锁  lock.lock();
// 3. finally 释放锁  lock.unlock();
class Ticket3 {

    private int num = 30;

    Lock lock = new ReentrantLock();

    public void sale() {

        lock.lock();
        
        try {
            if (num > 0) {
                System.out.println(Thread.currentThread().getName() + "还剩" + num--);
            }
        }catch (Exception e) {
            e.printStackTrace();
        }finally {
            lock.unlock();
        }

    }
}

A还剩30
A还剩29
A还剩28
A还剩27
A还剩26
A还剩25
C还剩24
C还剩23
C还剩22
C还剩21
C还剩20
C还剩19
C还剩18
C还剩17
C还剩16
C还剩15
C还剩14
C还剩13
C还剩12
C还剩11
C还剩10
C还剩9
C还剩8
C还剩7
C还剩6
C还剩5
C还剩4
C还剩3
C还剩2
C还剩1

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值