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

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

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

注意:Lock是个接口。

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

 public class SellTicket implements Runnable {//别忘了这个继承接口
// 定义100张票
private int tickets = 100; // 定义锁对象
private Lock lock = new ReentrantLock(); public void run() { //这里使用了不带catch的try..finally的格式,中间的代码出现问题了,就直接执行finally while (true) {
try { // 加锁,在会出现错误的代码前加锁,跟之前的一样
lock.lock(); if (tickets > 0) { // 休眠0.1秒
try {
Thread.sleep(100);
} catch (InterruptedException e) {
// TODO Auto-generated catch block
e.printStackTrace();
} System.out.println(Thread.currentThread().getName()
+ "正在出售第" + (tickets--) + "张票");
}
} finally {
// 解锁 中间代码一有异常,就解锁,
lock.unlock();
}
}
}
}

最新文章

  1. bzoj1588
  2. linux test 命令使用
  3. FL2440驱动添加(1):hello world 驱动模块添加
  4. LINUX 用户’nobody’
  5. Think Python - Chapter 18 - Inheritance
  6. ANDROID内存优化——大汇总(转)
  7. Java API设计CheckList
  8. Spring Boot MyBatis 连接数据库
  9. 【转载】python 模块 - random生成随机数模块
  10. 使用socket实现的ftp文件传输服务器
  11. eclipes快捷键
  12. 从输入URL到页面加载的全过程
  13. L2-028 秀恩爱分得快(模拟)
  14. Jenkins+Ansible+Gitlab自动化部署三剑客-Ansible本地搭建
  15. Eureka与ZooKeeper 的比较(转)
  16. Servlet基本_画面遷移
  17. 关于xml中自动提示功能的设置
  18. WebStorm project 打开多个项目的方法
  19. Opencv2教程一:图像变换之阈值二值threshold
  20. Linux 环境 HTTP 服务器

热门文章

  1. 为什么你找不到优秀的GISer?
  2. dispatch
  3. Android根据字符串加载Activity和图片
  4. iOS 图片加载导致内存警告
  5. assign、retain、copy使用异同
  6. 详解 Spotlight on Unix 监控Linux服务器
  7. 理解并自定义HttpHandler
  8. HashSet、LinkedHashSet、TreeSet
  9. jQuery中find和filter的区别
  10. pentaho cde 画图参数介绍