栏目分类:
子分类:
返回
名师互学网用户登录
快速导航关闭
当前搜索
当前分类
子分类
实用工具
热门搜索
名师互学网 > IT > 软件开发 > 后端开发 > Java

【JUC】Lock接口卖票例子

Java 更新时间: 发布时间: IT归档 最新发布 模块sitemap 名妆网 法律咨询 聚返吧 英语巴士网 伯小乐 网商动力

【JUC】Lock接口卖票例子

synchronized实现卖票

卖票例子,用synchronized关键字实现。

package juc.sync;


class Ticket{
    //票数
    private int number = 30;
    public synchronized void sale(){

        if(number > 0) {
            System.out.println(Thread.currentThread().getName() + ": 卖出" + (number--) + ", 还剩:" + number );
        }

    }

}
public class SaleTicket {
    public static void main(String[] args) {
        //创建Ticket 对象
        Ticket ticket = new Ticket();

        //创建三个线程
        new Thread(new Runnable() {
            @Override
            public void run() {
                for (int i = 0; i < 40; i++) {
                    ticket.sale();
                }
            }
        },"售票员AA").start();

        new Thread(new Runnable() {
            @Override
            public void run() {
                for (int i = 0; i < 40; i++) {
                    ticket.sale();
                }
            }
        },"售票员BB").start();

        new Thread(new Runnable() {
            @Override
            public void run() {
                for (int i = 0; i < 40; i++) {
                    ticket.sale();
                }
            }
        },"售票员CC").start();

    }
}
用Lock 可重入锁实现卖票
import java.util.concurrent.locks.ReentrantLock;

class LTicket{
    //票数
    private int number = 30;
    //创建可重入锁
    private final ReentrantLock lock = new ReentrantLock();

    //卖票方法
    public void sale(){
        //首先上锁
        lock.lock();
        try {
            if(number > 0) {
                System.out.println(Thread.currentThread().getName() + ": 卖出" + (number--) + ", 还剩:" + number );
            }
        }finally {
            //解锁
            lock.unlock();
        }
    }
}
public class LSaleTicket {
    public static void main(String[] args) {
        LTicket ticket = new LTicket();
        new Thread(()->{
            for (int i = 0; i < 40; i++) {
                ticket.sale();
            }
        },"售票员AA").start();

        new Thread(()->{
            for (int i = 0; i < 40; i++) {
                ticket.sale();
            }
        },"售票员BB").start();

        new Thread(()->{
            for (int i = 0; i < 40; i++) {
                ticket.sale();
            }
        },"售票员CC").start();
    }
}
Lock和synchroized 的不同
    Lock是一个接口,而synchroized是Java中的关键字,有内置语言实现synchroized在发生异常时,会自动释放线程占用的锁,不会导致死锁的发生。而Lock发生异常时,如果没有主动释放锁,很可能会造成死锁Lock 可以让等待锁的线程响应中断,而synchroized不行,使用synchroized时,等待线程会一直等待下去,不能响应中断。通过Lock可以知道有没有成功获取锁,而synchroized不能办到Lock可以提高多线程进行读的效率,大量线程同时竞争Lock性能远远优于synchroized
转载请注明:文章转载自 www.mshxw.com
本文地址:https://www.mshxw.com/it/749379.html
我们一直用心在做
关于我们 文章归档 网站地图 联系我们

版权所有 (c)2021-2022 MSHXW.COM

ICP备案号:晋ICP备2021003244-6号