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 黑泽明军
【转载文章务必保留出处和署名,谢谢!】
低调大师中文资讯倾力打造互联网数据资讯、行业资源、电子商务、移动互联网、网络营销平台。
持续更新报道IT业界、互联网、市场资讯、驱动更新,是最及时权威的产业资讯及硬件资讯报道平台。
转载内容版权归作者及来源网站所有,本站原创内容转载请注明来源。
- 上一篇
Jmeter之tomcat性能测试+性能改进措施
Jmeter用于tomcat性能测试,因为项目部署在tomcat,正常情况下,一个tomcat可以承受500个并发,通过修改配置,及其相关的tomcat优化,可以承受到1000个并发。 如何测试tomcat优化前和优化后的结果? 通过Jmeter测试,就能达到对应的效果 Jmeter测试tomcat比较简单 1.建立对应的线程组 2.建立Http请求 需要填写的一个是协议名称,一个是IP地址或域名,一个是端口号,还有一个是路径 这个路径默认不填也行,如果具体到post或get请求及其携带参数,就需要填写 如果测试具体的get或post请求,加请求url和对应的参数,如下图所示: 注意和postMan工具有些相似,不同于postman,Jmeter可以进行多用户测试,即多个线程测试 通过察看结果树,可以查看请求失败: 聚合报告可供分析: server.xml文件: 线程池优化: 连接池优化: Executor重要参数说明: name:共享线程池的名字。这是Connector为了共享线程池要引用的名字,该名字必须唯一。默认值:None; namePrefix:在JVM上,每个运...
- 下一篇
利用python3获取当前计算机的名字和IP
众所周知,python是一门非常强大且简洁的语言。本篇主要来为大家介绍windows和linux下如何利用python获取当前计算机的ip和计算机名。 windows下,主要是利用socket模块。具体代码如下: import socket 获取 import socket Compute_name=socket.getfqdn(socket.gethostname()) # get name Compute_addr=socket.gethostbyname(Compute_name) #get ip print(Compute_name) print(Compute_addr) 运行结果 但是值得注意的是这里获取的ip地址是内网ip地址。 ———————————————— 获取本机的mac地址 1 2 3 4 import uuid def get_mac_address(): mac = uuid.UUID( int = uuid.getnode()). hex [ - 12 :] return ":" .join([mac[e:e + 2 ] for e in range ...
相关文章
文章评论
共有0条评论来说两句吧...
文章二维码
点击排行
-
Docker使用Oracle官方镜像安装(12C,18C,19C)
- Springboot2将连接池hikari替换为druid,体验最强大的数据库连接池
- CentOS8编译安装MySQL8.0.19
- Docker快速安装Oracle11G,搭建oracle11g学习环境
- SpringBoot2配置默认Tomcat设置,开启更多高级功能
- MySQL8.0.19开启GTID主从同步CentOS8
- CentOS7,8上快速安装Gitea,搭建Git服务器
- Jdk安装(Linux,MacOS,Windows),包含三大操作系统的最全安装
- SpringBoot2编写第一个Controller,响应你的http请求并返回结果
推荐阅读
最新文章
- Linux系统CentOS6、CentOS7手动修改IP地址
- CentOS6,7,8上安装Nginx,支持https2.0的开启
- Springboot2将连接池hikari替换为druid,体验最强大的数据库连接池
- Docker使用Oracle官方镜像安装(12C,18C,19C)
- CentOS6,CentOS7官方镜像安装Oracle11G
- SpringBoot2整合Redis,开启缓存,提高访问速度
- Jdk安装(Linux,MacOS,Windows),包含三大操作系统的最全安装
- SpringBoot2配置默认Tomcat设置,开启更多高级功能
- SpringBoot2整合MyBatis,连接MySql数据库做增删改查操作
- Hadoop3单机部署,实现最简伪集群