zoukankan      html  css  js  c++  java
  • JDK5中Lock锁的使用

    (1)JDK5中Lock锁的使用
      虽然我们可以理解同步代码块和同步方法的锁对象问题,但是我们并没有直接看到在哪里加上了锁,在哪里释放了锁,为了更清晰的表达如何加锁和释放锁,JDK5以后提供了一个新的锁对象Lock接口。
      即:JDK5以后的针对线程的锁定操作释放操作
      Lock实现提供了比使用synchronized方法和语句可获得的更广泛的锁定操作。

    (2)Lock接口的方法
      void lock() 获取锁(加锁)
      void unlock() 释放锁

      ReentrantLock类是Lock接口的实现类。

    (3)示例代码如下

     1 package cn.itcast_01;
     2 /*
     3  * 虽然我们可以理解同步代码块和同步方法的锁对象问题,但是我们并没有直接看到在哪里加上了锁,在哪里释放了锁,
     4  * 为了更清晰的表达如何加锁和释放锁,JDK5以后提供了一个新的锁对象Lock接口 5  * 
     6  * Lock接口的方法:
     7  *         void lock() 获取锁(加锁)
     8  *         void unlock() 释放锁
     9  * 
    10  * ReentrantLock类是Lock接口的实现类。
    11  */
    12 public class SellTicketDemo {
    13     public static void main(String[] args) {
    14         // 创建资源对象
    15         SellTicket st = new SellTicket();
    16 
    17         // 创建三个线程对象
    18         Thread t1 = new Thread(st, "窗口1");
    19         Thread t2 = new Thread(st, "窗口2");
    20         Thread t3 = new Thread(st, "窗口3");
    21 
    22         // 启动线程
    23         t1.start();
    24         t2.start();
    25         t3.start();
    26     }
    27 }
     1 package cn.itcast_01;
     2 
     3 import java.util.concurrent.locks.Lock;
     4 import java.util.concurrent.locks.ReentrantLock;
     5 
     6 public class SellTicket implements Runnable {
     7     // 定义票
     8     private int tickets = 100;
     9 
    10     // 定义锁对象
    11     private Lock lock = new ReentrantLock(); // 多态
    12 
    13     @Override
    14     public void run() {
    15         while (true) {
    16             // 如果锁里面有异常发生,释放锁lock.unlock();就不会被执行,
    17             // 为了保证释放锁lock.unlock();被执行,使用try...finally...
    18             // 将lock.unlock();放在finally里面。
    19             try {
    20                 // 获取锁(加锁)
    21                 lock.lock();
    22                 if (tickets > 0) {
    23                     try {
    24                         Thread.sleep(100);
    25                     } catch (InterruptedException e) {
    26                         e.printStackTrace();
    27                     }
    28                     System.out.println(Thread.currentThread().getName() + "正在出售第" + (tickets--) + "张票");
    29                 }
    30             } finally {
    31                 // 释放锁
    32                 lock.unlock();
    33             }
    34         }
    35     }
    36 
    37 }
  • 相关阅读:
    复制功能的实现
    SDWebImage从缓存中获取图片
    修改屏幕亮度
    使用系统的CoreLocation定位
    button设置边宽和圆角
    在日期选择轮中选择的时间转换成年龄
    字符串与数组互转
    使用ASI传递post表单..参数是数组
    点击头像单独把图片拉取出来.然后再次点击回到初始效果
    Xcode svn import项目 上传.a文件(静态库)
  • 原文地址:https://www.cnblogs.com/chenmingjun/p/8729463.html
Copyright © 2011-2022 走看看