• Java之解决线程安全问题的方式三:Lock锁




    import java.util.concurrent.locks.ReentrantLock;

    /**
    * 解决线程安全问题的方式三:Lock锁 --- JDK5.0新增
    *
    * 1. 面试题:synchronized 与 Lock的异同?
    * 相同:二者都可以解决线程安全问题
    * 不同:synchronized机制在执行完相应的同步代码以后,自动的释放同步监视器
    * Lock需要手动的启动同步(lock()),同时结束同步也需要手动的实现(unlock())
    *
    * 2.优先使用顺序:
    * Lock  同步代码块(已经进入了方法体,分配了相应资源)  同步方法(在方法体之外)
    *
    *
    * 面试题:如何解决线程安全问题?有几种方式
    */
    class Window implements Runnable{

    private int ticket = 100;
    //1.实例化ReentrantLock
    private ReentrantLock lock = new ReentrantLock();

    @Override
    public void run() {
    while(true){
    try{

    //2.调用锁定方法lock()
    lock.lock();

    if(ticket > 0){

    try {
    Thread.sleep(100);
    } catch (InterruptedException e) {
    e.printStackTrace();
    }

    System.out.println(Thread.currentThread().getName() + ":售票,票号为:" + ticket);
    ticket--;
    }else{
    break;
    }
    }finally {
    //3.调用解锁方法:unlock()
    lock.unlock();
    }

    }
    }
    }

    public class LockTest {
    public static void main(String[] args) {
    Window w = new Window();

    Thread t1 = new Thread(w);
    Thread t2 = new Thread(w);
    Thread t3 = new Thread(w);

    t1.setName("窗口1");
    t2.setName("窗口2");
    t3.setName("窗口3");

    t1.start();
    t2.start();
    t3.start();
    }
    }
  • 相关阅读:
    c++ 判断是元音还是辅音
    c++示例 计算器
    c++容器 算法 迭代
    获取 Django版本号的两种方式
    ImportError: No module named pytz
    Nginx配置proxy_pass转发的/路径问题
    VIM复制粘贴大全!
    SSL协议与数字证书原理
    分析支付宝客户端的插件机制
    PHP session的实现原理
  • 原文地址:https://www.cnblogs.com/wpy188/p/12099892.html
Copyright © 2020-2023  润新知