zoukankan      html  css  js  c++  java
  • java 22

    在之前解决线程安全的过程中,虽然我们可以理解同步代码块和同步方法的锁对象问题,

    但是我们并没有直接看到在哪里加上了锁,在哪里释放了锁,

    为了更清晰的表达如何加锁和释放锁,JDK5以后提供了一个新的锁对象Lock

    注意:Lock是个接口。

    2个常用方法:
       void lock(): 获取锁。
       void unlock():释放锁。
     ReentrantLock是Lock的实现类。

     1 public class SellTicket implements Runnable {//别忘了这个继承接口
     2     // 定义100张票
     3     private int tickets = 100;
     4 
     5     // 定义锁对象
     6     private Lock lock = new ReentrantLock();
     7 
     8     public void run() {
     9 
    10         //这里使用了不带catch的try..finally的格式,中间的代码出现问题了,就直接执行finally
    11 
    12         while (true) {
    13             try {
    14                 
    15                 // 加锁,在会出现错误的代码前加锁,跟之前的一样
    16                 lock.lock();
    17                 
    18                 if (tickets > 0) {
    19                                         
    20                     // 休眠0.1秒
    21                     try {
    22                         Thread.sleep(100);
    23                     } catch (InterruptedException e) {
    24                         // TODO Auto-generated catch block
    25                         e.printStackTrace();
    26                     }
    27 
    28                     System.out.println(Thread.currentThread().getName()
    29                             + "正在出售第" + (tickets--) + "张票");
    30                 }
    31             } finally {
    32                 // 解锁  中间代码一有异常,就解锁,
    33                 lock.unlock();
    34             }
    35         }
    36     }
    37 }
    何事都只需坚持.. 难? 维熟尔。 LZL的自学历程...只需坚持
  • 相关阅读:
    lua 根据路径获取文件名
    python中的re模块
    正则表达式中的开头和结尾
    正则表达式匹配多个字符
    正则表达式中匹配单个字符
    正则表达式的作用
    gevent实现协程
    greenlet实现协程
    生成器的使用注意
    生成器实现斐波那契数列
  • 原文地址:https://www.cnblogs.com/LZL-student/p/5946893.html
Copyright © 2011-2022 走看看