JDK5中Lock锁的使用

简介: (1)JDK5中Lock锁的使用   虽然我们可以理解同步代码块和同步方法的锁对象问题,但是我们并没有直接看到在哪里加上了锁,在哪里释放了锁,为了更清晰的表达如何加锁和释放锁,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 }

 

我的GitHub地址: https://github.com/heizemingjun
我的博客园地址: http://www.cnblogs.com/chenmingjun
我的蚂蚁笔记博客地址: http://blog.leanote.com/chenmingjun
Copyright ©2018 黑泽明军
【转载文章务必保留出处和署名,谢谢!】
相关文章
|
1月前
|
Oracle Java 关系型数据库
【颠覆性升级】JDK 22:超级构造器与区域锁,重塑Java编程的两大基石!
【9月更文挑战第6天】JDK 22的发布标志着Java编程语言在性能和灵活性方面迈出了重要的一步。超级构造器和区域锁这两大基石的引入,不仅简化了代码设计,提高了开发效率,还优化了垃圾收集器的性能,降低了应用延迟。这些改进不仅展示了Oracle在Java生态系统中的持续改进和创新精神,也为广大Java开发者提供了更多的可能性和便利。我们有理由相信,在未来的Java编程中,这些新特性将发挥越来越重要的作用,推动Java技术不断向前发展。
解决线程安全问题的方式三:Lock锁 ---JDK5.0新增
解决线程安全问题的方式三:Lock锁 ---JDK5.0新增
30 0
详解JDK锁02:万字文!结合实战案例,手撕AQS源码!
详解JDK锁02:万字文!结合实战案例,手撕AQS源码!
|
Java C++
详解JDK锁01:结合源码一文弄懂Lock接口!
详解JDK锁01:结合源码一文弄懂Lock接口!
119 0
|
存储 安全 算法
面试官问:JDK8 的ConcurrentHashMap为什么放弃了分段锁
我是鸭血粉丝,今天我们来讨论一下一个比较经典的面试题就是 ConcurrentHashMap 为什么放弃使用了分段锁,这个面试题阿粉相信很多人肯定觉得有点头疼,因为很少有人在开发中去研究这块的内容,今天阿粉就来给大家讲一下这个 ConcurrentHashMap 为什么在 JDK8 中放弃了使用分段锁。
面试官问:JDK8 的ConcurrentHashMap为什么放弃了分段锁
|
存储 调度
一个带有邮戳的锁StampedLock(jdk1.8出现)
jdk1.8真的可以作为一个宝藏,随便一个新的特性都足以写一本书,今天分析一个在jdk1.8中,引入的一个新的带有邮戳的StampedLock。这篇文章主要从使用的角度来分析一下:
180 0
|
Java
从JDK源码角度看并发锁的优化
        在CLH锁核心思想的影响下,JDK并发包以CLH锁作为基础而设计,其中主要是考虑到CLH锁更容易实现取消与超时功能。比起原来的CLH锁已经做了很大的改造,主要从两方面进行了改造:节点的结构与节点等待机制。
1127 0
|
23天前
|
Java
安装JDK18没有JRE环境的解决办法
安装JDK18没有JRE环境的解决办法
107 3
|
2月前
|
Java 关系型数据库 MySQL
"解锁Java Web传奇之旅:从JDK1.8到Tomcat,再到MariaDB,一场跨越数据库的冒险安装盛宴,挑战你的技术极限!"
【8月更文挑战第19天】在Linux上搭建Java Web应用环境,需安装JDK 1.8、Tomcat及MariaDB。本指南详述了使用apt-get安装OpenJDK 1.8的方法,并验证其版本。接着下载与解压Tomcat至`/usr/local/`目录,并启动服务。最后,通过apt-get安装MariaDB,设置基本安全配置。完成这些步骤后,即可验证各组件的状态,为部署Java Web应用打下基础。
43 1