Lock锁确保线程安全

在同一个JVM下,如何确保线程安全?

在我们所熟悉的前提下,主要通过以下俩种手段确保线程的安全性。
1、synchronized关键词
2、锁

什么是锁?

通俗的讲,就是每家每户出门的时候都是需要锁门的,避免小偷光顾!在我们Java里上锁的方式有ReentrantLock、ReentrantReadWriteLock俩种实现方式。此处我理解的加锁处理数据的方式是:串行。

ReentrantLock保证线程安全

需求:
我们现在总共有10张通往大理的飞机票,并且有三个售票窗口进行售票,该如何设计购票程序,使其不会有少售,多售的情况出现?

定义三个售票窗口如下:

 MyRunable myRunable = new MyRunable();
 Thread thread = new Thread(myRunable, "窗口一");
 Thread thread1 = new Thread(myRunable, "窗口二");
 Thread thread2 = new Thread(myRunable, "窗口三");
 thread.start();
 thread1.start();
 thread2.start();

定义具体售票操作如下:

public class MyRunable implements  Runnable {
    private int tickets = 10; // 定义十张票
    private final Lock lock =  new ReentrantLock();
    @Override
    public void run() {
        while (true){
            lock.lock();
            if (tickets > 0){
                try {
                    Thread.sleep(1000);
                    System.out.println(Thread.currentThread().getName() +" 出售了第 " + tickets-- + " 张票");
                }catch (Exception e){
                    e.printStackTrace();
                }finally {
                    lock.unlock();
                }
            }else{
                lock.unlock();
            }
        }
    }
}

在我们加锁的前提下,切记需要在final中去释放锁,不然会造成死锁状态!

购票期望结果:
在这里插入图片描述

ReentrantReadWriteLock保证线程安全

需求:
我们现在总共有10张通往大理的飞机票,并且有三个售票窗口进行售票,该如何设计购票程序,使其不会有少售,多售的情况出现?

定义三个售票窗口如下:

 MyRunableReadWrite myRunable = new MyRunableReadWrite();
 Thread thread = new Thread(myRunable, "窗口一");
 Thread thread1 = new Thread(myRunable, "窗口二");
 Thread thread2 = new Thread(myRunable, "窗口三");
 thread.start();
 thread1.start();
 thread2.start();

定义具体售票操作如下:

public class MyRunableReadWrite implements  Runnable {
    private int tickets = 10; // 定义十张票
    private final ReadWriteLock readWriteLock = new ReentrantReadWriteLock();
    @Override
    public void run() {
        while (true){
            readWriteLock.readLock().lock();
            if (tickets > 0){
                try {
                    readWriteLock.readLock().unlock();
                    readWriteLock.writeLock().lock();
                    Thread.sleep(1000);
                    System.out.println(Thread.currentThread().getName() +" 出售了第 " + tickets-- + " 张票");
                }catch (Exception e){
                    e.printStackTrace();
                }finally {
                    readWriteLock.writeLock().unlock();
                }
            }else {
                readWriteLock.readLock().unlock();
            }
        }
    }
}

读写锁,在我们日常开发中也是及其重要的一个锁,具体理解如下:我们程序首先给读锁加锁,读到数据进行读锁解锁操作,并给写锁加锁,等数据写完之后给写锁进行解锁操作。必须进行解锁操作,否则会造成死锁。

购票期望结果:
在这里插入图片描述

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

胤墨

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值