zoukankan      html  css  js  c++  java
  • 使用Lock接口来解决线程安全的问题

    package cn.itcast.demo16.Demo09.Lock;

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

    /**
    * @author newcityman
    * @date 2019/7/24 - 20:38
    * 解决线程安全问题的第三种方案:使用lock锁
    * java.util.concurrent.locks.lock接口
    * Lock实现提供了比使用synchronized方法和语句可获得的更广泛的锁定操作
    * Lock接口中的方法:
    * void lock()获取锁
    * void unlock()释放锁
    * java.util.concurrent.Locks.ReentrantLock implements Lock接口
    *
    * 使用步骤:
    * 1、在乘员位置创建一个ReentrantLock implement Lock接口
    * 2、在可能出现安全问题的代码前调用Lock接口中的lock方法获取锁
    * 3、在可能出现安全问题的代码后调用Lock接口中的unLock方法释放锁
    */
    public class RunnableImpl implements java.lang.Runnable {
    private int ticket = 100;

    Lock l = new ReentrantLock();

    @Override
    public void run() {
    while (true) {
    l.lock();
    try {
    Thread.sleep(10);
    if (ticket > 0) {
    System.out.println(Thread.currentThread().getName() + "--->正在卖" + ticket + "张票");
    ticket--;
    }
    } catch (InterruptedException e) {
    e.printStackTrace();
    } catch (Exception e) {
    e.printStackTrace();
    } finally {
    l.unlock();
    }
    }
    }
    }



    package cn.itcast.demo16.Demo09.Lock;

    /**
    * @author newcityman
    * @date 2019/7/24 - 20:44
    */
    public class Demo01TicketLock {
    public static void main(String[] args) {
    RunnableImpl impl = new RunnableImpl();
    Thread t1 = new Thread(impl);
    Thread t2 = new Thread(impl);
    Thread t3 = new Thread(impl);

    t1.start();
    t2.start();
    t3.start();
    }
    }
  • 相关阅读:
    【内推】平安产险大数据测试开发工程师,15-30k!
    python中的正则表达式(re模块)
    C#中ArrayList和string,string[]数组的转换
    C# 中的sealed修饰符学习
    面试题目记录
    C#中Internal class与静态类说明
    转载 C#使用Salt + Hash来为密码加密
    转载C# 对象转Json序列化
    使用https时,网站一些内容不能正常显示的问题
    转载 JQuery.data()方法学习
  • 原文地址:https://www.cnblogs.com/newcityboy/p/11240938.html
Copyright © 2011-2022 走看看