Android(java)学习笔记9:JDK5之后的Lock锁的概述和使用
1. Lock锁的概述:
java.util.concurrent.locks,接口Lock
首先Lock是一个接口,Lock实现提供了比使用synchronized方法 和 同步代码块更为广泛的锁定操作。
void lock():获取锁
void unlock():释放锁
上面Lock是接口,我们要找它的实现类,如下:
ReentrantLock, ReentrantReadWriteLock.ReadLock,ReentrantReadWriteLock.WriteLock
2. 关于Lock锁的使用,如下:
package com.himi.test; import java.util.concurrent.locks.Lock;
import java.util.concurrent.locks.ReentrantLock; public class SellTicket implements Runnable { // 定义票
private int tickets = 40; // 定义锁对象
private Lock lock = new ReentrantLock(); @Override()
public void run() {
while (true) {//这里利用try{}finally{},是因为担心程序加锁之后出问题,不能跳出解锁
try {
// 加锁
lock.lock();
if (tickets > 0) {
try {
Thread.sleep(100);
} catch (InterruptedException e) {
e.printStackTrace();
}
System.out.println(Thread.currentThread().getName()
+ "正在出售第" + (tickets--) + "张票");
}
} finally {
// 释放锁
lock.unlock();
}
}
} }
下面是使用测试代码,如下:
package com.himi.test;
public class SellTicketDemo {
public static void main(String[] args) {
// 创建资源对象
SellTicket st = new SellTicket();
// 创建三个窗口
Thread t1 = new Thread(st, "窗口1");
Thread t2 = new Thread(st, "窗口2");
Thread t3 = new Thread(st, "窗口3");
// 启动线程
t1.start();
t2.start();
t3.start();
}
}
上面程序的运行结果如下,Console结果如下:
窗口1正在出售第40张票
窗口3正在出售第39张票
窗口3正在出售第38张票
窗口3正在出售第37张票
窗口3正在出售第36张票
窗口3正在出售第35张票
窗口2正在出售第34张票
窗口2正在出售第33张票
窗口2正在出售第32张票
窗口2正在出售第31张票
窗口2正在出售第30张票
窗口2正在出售第29张票
窗口1正在出售第28张票
窗口3正在出售第27张票
窗口3正在出售第26张票
窗口3正在出售第25张票
窗口3正在出售第24张票
窗口2正在出售第23张票
窗口2正在出售第22张票
窗口2正在出售第21张票
窗口2正在出售第20张票
窗口1正在出售第19张票
窗口1正在出售第18张票
窗口1正在出售第17张票
窗口3正在出售第16张票
窗口3正在出售第15张票
窗口3正在出售第14张票
窗口3正在出售第13张票
窗口3正在出售第12张票
窗口3正在出售第11张票
窗口2正在出售第10张票
窗口2正在出售第9张票
窗口1正在出售第8张票
窗口3正在出售第7张票
窗口3正在出售第6张票
窗口2正在出售第5张票
窗口1正在出售第4张票
窗口1正在出售第3张票
窗口1正在出售第2张票
窗口3正在出售第1张票
Android(java)学习笔记9:JDK5之后的Lock锁的概述和使用的更多相关文章
- Android(java)学习笔记69:JDK5之后的Lock锁的概述和使用
1. Lock锁的概述: java.util.concurrent.locks,接口Lock 首先Lock是一个接口,Lock实现提供了比使用synchronized方法 和 同步代码块更为广泛的锁定 ...
- java学习笔记之基础篇
java选择语句之switch //switch可以用于等值判断 switch (e) //int ,或则可以自动转化成int 的类型,(byte char short)枚举jdk 7中可以防止字 ...
- 0028 Java学习笔记-面向对象-Lambda表达式
匿名内部类与Lambda表达式示例 下面代码来源于:0027 Java学习笔记-面向对象-(非静态.静态.局部.匿名)内部类 package testpack; public class Test1{ ...
- 《Java学习笔记(第8版)》学习指导
<Java学习笔记(第8版)>学习指导 目录 图书简况 学习指导 第一章 Java平台概论 第二章 从JDK到IDE 第三章 基础语法 第四章 认识对象 第五章 对象封装 第六章 继承与多 ...
- Android动画学习笔记-Android Animation
Android动画学习笔记-Android Animation 3.0以前,android支持两种动画模式,tween animation,frame animation,在android3.0中 ...
- Java学习笔记:语言基础
Java学习笔记:语言基础 2014-1-31 最近开始学习Java,目的倒不在于想深入的掌握Java开发,而是想了解Java的基本语法,可以阅读Java源代码,从而拓展一些知识面.同时为学习An ...
- Android 数字签名学习笔记
Android 数字签名学习笔记 在Android系统中,所有安装到系统的应用程序都必有一个数字证书,此数字证书用于标识应用程序的作者和在应用程序之间建立信任关系,如果一个permission的pro ...
- 【Java学习笔记之二十六】深入理解Java匿名内部类
在[Java学习笔记之二十五]初步认知Java内部类中对匿名内部类做了一个简单的介绍,但是内部类还存在很多其他细节问题,所以就衍生出这篇博客.在这篇博客中你可以了解到匿名内部类的使用.匿名内部类要注意 ...
- 20145316许心远《Java学习笔记(第8版)》课程总结
20145316许心远<Java学习笔记(第8版)>课程总结 每周读书笔记链接汇总 ▪ 第一周读书笔记 ▪ 第二周读书笔记 ▪ 第三周读书笔记 ▪ 第四周读书笔记 ▪ 第五周读书笔记 ▪ ...
随机推荐
- 千万不要犯这种愚蠢的错误:Property 'XXX' not found on type java.lang.String
一定是: <c:forEach var="book" items="${booklist}"> 而不是: <c:forEach var=&qu ...
- 01-oracle限定查询-20190404
关系型数据库和半结构化数据(xml文件) oracle12c:c代表云计算 PDB,CDB sql语句执行顺序: 第一步:from子句控制数据来源: 第二步:where子句使用限定符对数据行过滤: 第 ...
- 牛客网Java刷题知识点之为什么HashMap和HashSet区别
不多说,直接上干货! HashMap 和 HashSet的区别是Java面试中最常被问到的问题.如果没有涉及到Collection框架以及多线程的面试,可以说是不完整.而Collection框架的 ...
- ife task0003学习笔记(三):JavaScript闭包
一.this易错分析 在学习闭包的时候,有一个概念this很重要,关于this的理解,下面3种情况:this指向谁? fn.call(obj1); obj2.fn() fn() 答案是obj1 obj ...
- 使用request与正则表达式爬取bangumi动画排行榜
import json import requests from requests.exceptions import RequestException import re import time d ...
- Java基础之 学java从宝宝的命令行做起
JAVA学习笔记 JAVA命令行 在当前文件的命令行下 编译:输入命令javac GetGreeting.java 执行 命令 Java GetGreeting 有package包的程序 1.到文件当 ...
- 多线程TCP的socket通信
应用多线程来实现服务器与多客户端之间的通信. 基本步骤: 1.服务器端创建ServerSocket,循环调用accept()等待客户端的连接 2.客户端创建一个socket并请求和服务器端的连接 3. ...
- python之迭代器
原文 我们已经知道,可以直接作用于for循环的数据类型有以下几种: 一类是集合数据类型,如list.tuple.dict.set.str等: 一类是generator,包括生成器和带yield的gen ...
- js中的this问题
this this的指向在函数定义的时候是确定不了的,只有函数执行的时候才能确定this到底指向谁,实际上 this的最终指向的是那个调用它的对象(这里其实并不完全对,this的指向有时候会很微妙,得 ...
- git取消本地commit
如果不小心commit了一个不需要commit的文件,可以对其进行撤销. 先使用git log 查看 commit日志 commit 422bc088a7d6c5429f1d0760d008d86c5 ...