资讯专栏INFORMATION COLUMN

解决方法三:lock锁机制

trigkit4 / 3403人阅读

摘要:卖票案例出现了线程安全问题卖出了不存在的票和重复的票解决线程安全问题的三种方案使用锁接口实现提供了比使用方法和语句可获得的更广泛的锁定操作。接口中的方法获取锁。


package com.itheima.demo09.Lock;

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

/*

卖票案例出现了线程安全问题
卖出了不存在的票和重复的票

解决线程安全问题的三种方案:使用Lock锁
java.util.concurrent.locks.Lock接口
Lock 实现提供了比使用 synchronized 方法和语句可获得的更广泛的锁定操作。
Lock接口中的方法:
    void lock()获取锁。
    void unlock()  释放锁。
java.util.concurrent.locks.ReentrantLock implements Lock接口


使用步骤:
    1.在成员位置创建一个ReentrantLock对象
    2.在可能会出现安全问题的代码前调用Lock接口中的方法lock获取锁
    3.在可能会出现安全问题的代码后调用Lock接口中的方法unlock释放锁

*/
public class RunnableImpl implements Runnable{

//定义一个多个线程共享的票源
private  int ticket = 100;

//1.在成员位置创建一个ReentrantLock对象
Lock l = new ReentrantLock();

//设置线程任务:卖票
@Override
public void run() {
    //使用死循环,让卖票操作重复执行
    while(true){
        //2.在可能会出现安全问题的代码前调用Lock接口中的方法lock获取锁
        l.lock();

        //先判断票是否存在
        if(ticket>0){
            //提高安全问题出现的概率,让程序睡眠
            try {
                Thread.sleep(10);
                //票存在,卖票 ticket--
                System.out.println(Thread.currentThread().getName()+"-->正在卖第"+ticket+"张票");
                ticket--;
            } catch (InterruptedException e) {
                e.printStackTrace();
            }finally {
                //3.在可能会出现安全问题的代码后调用Lock接口中的方法unlock释放锁
                l.unlock();//无论程序是否异常,都会把锁释放
            }
        }
    }
}

/*//设置线程任务:卖票
@Override
public void run() {
    //使用死循环,让卖票操作重复执行
    while(true){
       //2.在可能会出现安全问题的代码前调用Lock接口中的方法lock获取锁
       l.lock();

        //先判断票是否存在
        if(ticket>0){
            //提高安全问题出现的概率,让程序睡眠
            try {
                Thread.sleep(10);
            } catch (InterruptedException e) {
                e.printStackTrace();
            }

            //票存在,卖票 ticket--
            System.out.println(Thread.currentThread().getName()+"-->正在卖第"+ticket+"张票");
            ticket--;
        }

        //3.在可能会出现安全问题的代码后调用Lock接口中的方法unlock释放锁
        l.unlock();
    }
}*/

}
package com.itheima.demo09.Lock;

/*

模拟卖票案例
创建3个线程,同时开启,对共享的票进行出售

*/
public class Demo01Ticket {

public static void main(String[] args) {
    //创建Runnable接口的实现类对象
    RunnableImpl run = new RunnableImpl();
    //创建Thread类对象,构造方法中传递Runnable接口的实现类对象
    Thread t0 = new Thread(run);
    Thread t1 = new Thread(run);
    Thread t2 = new Thread(run);
    //调用start方法开启多线程
    t0.start();
    t1.start();
    t2.start();
}

}

文章版权归作者所有,未经允许请勿转载,若此文章存在违规行为,您可以联系管理员删除。

转载请注明本文地址:https://www.ucloud.cn/yun/75599.html

相关文章

  • Java多线程学习(六)Lock的使用

    摘要:返回与此锁相关联的给定条件等待的线程数的估计。查询是否有线程正在等待获取此锁。为公平锁,为非公平锁线程运行了获得锁定运行结果公平锁的运行结果是有序的。 系列文章传送门: Java多线程学习(一)Java多线程入门 Java多线程学习(二)synchronized关键字(1) java多线程学习(二)synchronized关键字(2) Java多线程学习(三)volatile关键字 ...

    Caicloud 评论0 收藏0
  • Java多线程学习(四)等待/通知(wait/notify)机制

    摘要:运行可运行状态的线程获得了时间片,执行程序代码。阻塞的情况分三种一等待阻塞运行的线程执行方法,会把该线程放入等待队列中。死亡线程方法执行结束,或者因异常退出了方法,则该线程结束生命周期。死亡的线程不可再次复生。 系列文章传送门: Java多线程学习(一)Java多线程入门 Java多线程学习(二)synchronized关键字(1) java多线程学习(二)synchronized关键...

    PiscesYE 评论0 收藏0
  • Java机制了解一下

    摘要:底层是是通过对象,对象有自己的对象头,存储了很多信息,其中一个信息标示是被哪个线程持有。当一个线程执行的代码出现异常时,其所持有的锁会自动释放。 前言 回顾前面: 多线程三分钟就可以入个门了! Thread源码剖析 多线程基础必要知识点!看了学习多线程事半功倍 只有光头才能变强! 本文章主要讲的是Java多线程加锁机制,有两种: Synchronized 显式Lock 不得不唠...

    hyuan 评论0 收藏0
  • 分布式机制原理及实现方式

    摘要:分布式锁实现方式前言目前几乎很多大型网站及应用都是分布式部署的,分布式场景中的数据一致性问题一直是一个比较重要的话题。基于数据库实现分布式锁基于缓存等实现分布式锁基于实现分布式锁。 前言 分布式锁,是控制分布式系统之间同步访问共享资源的一种方式 在分布式系统中,常常需要协调他们的动作。如果不同的系统或是同一个系统的不同主机之间共享了一个或一组资源,那么访问这些资源的时候,往往需要互斥...

    yacheng 评论0 收藏0

发表评论

0条评论

最新活动
阅读需要支付1元查看
<