Lock接口示例
Lock 的挂起 await() 唤醒signal()
Lock 简单示例
public class LockDemo {
public static void main(String[] args) {
SaleTicket saleTicket = new SaleTicket();
new Thread(() -> {
for (int i = 1; i < 20; i++) {
saleTicket.sale();
}
}, "1号员工").start();
new Thread(() -> {
for (int i = 1; i < 20; i++) {
saleTicket.sale();
}
}, "2号员工").start();
new Thread(() -> {
for (int i = 1; i < 20; i++) {
saleTicket.sale();
}
}, "3号员工").start();
}
}
class SaleTicket {
private int number = 20;
private Lock lock = new ReentrantLock();
public void sale() {
lock.lock();//一进入就上锁
try {
if (number > 0) {
System.out.println(Thread.currentThread().getName() + "\t 卖出" + number-- + "号票\t还剩" + number);
}
} catch (Exception e) {
e.printStackTrace();
} finally {
lock.unlock();//最后一定要解锁
}
}
}
结果:
1号员工 卖出20号票 还剩19
1号员工 卖出19号票 还剩18
1号员工 卖出18号票 还剩17
1号员工 卖出17号票 还剩16
1号员工 卖出16号票 还剩15
1号员工 卖出15号票 还剩14
1号员工 卖出14号票 还剩13
1号员工 卖出13号票 还剩12
1号员工 卖出12号票 还剩11
1号员工 卖出11号票 还剩10
1号员工 卖出10号票 还剩9
1号员工 卖出9号票 还剩8
1号员工 卖出8号票 还剩7
1号员工 卖出7号票 还剩6
1号员工 卖出6号票 还剩5
1号员工 卖出5号票 还剩4
1号员工 卖出4号票 还剩3
3号员工 卖出3号票 还剩2
3号员工 卖出2号票 还剩1
2号员工 卖出1号票 还剩0
推荐启动线程的方式
第一种:匿名内部类
/*new Thread(new Runnable() {
@Override
public void run() {
for (int i = 1; i <= 20; i++) {
ticket.sale();
}
}
}, "AA").start();
new Thread(new Runnable() {
@Override
public void run() {
for (int i = 1; i <= 20; i++) {
ticket.sale();
}
}
}, "BB").start();
new Thread(new Runnable() {
@Override
public void run() {
for (int i = 1; i <= 20; i++) {
ticket.sale();
}
}
}, "CC").start();
*/
第二种:lombda表达式
new Thread(() -> {
for (int i = 1; i < 20; i++) {
saleTicket.sale();
}
}, "1号员工").start();
new Thread(() -> {
for (int i = 1; i < 20; i++) {
saleTicket.sale();
}
}, "2号员工").start();
new Thread(() -> {
for (int i = 1; i < 20; i++) {
saleTicket.sale();
}
}, "3号员工").start();
实现线程通信 一个生产 一个消费
public class Test02 {
public static void main(String[] args) {
shareDataOne shareDataOne = new shareDataOne();
new Thread(() -> {
for (int i = 0; i <= 10; i++) {
shareDataOne.incr();
}
}, "AA").start();
new Thread(() -> {
for (int i = 0; i <= 10; i++) {
shareDataOne.decr();
}
}, "BB").start();
new Thread(() -> {
for (int i = 0; i <= 10; i++) {
shareDataOne.incr();
}
}, "CC").start();
new Thread(() -> {
for (int i = 0; i <= 10; i++) {
shareDataOne.decr();
}
}, "DD").start();
}
}
class shareDataOne {
private int number = 0;
private Lock lock = new ReentrantLock();
private Condition cd = lock.newCondition();
public void incr() {
lock.lock();
try {
while (number != 0) {
cd.await();
}
number++;
System.out.println(Thread.currentThread().getName() + "\t" + number);
cd.signalAll();//此处唤醒用ALL避免死锁
} catch (Exception e) {
} finally {
lock.unlock();
}
}
public void decr() {
lock.lock();
try {
while (number == 0) {
cd.await();
}
number--;
System.out.println(Thread.currentThread().getName() + "\t" + number);
cd.signalAll();//此处唤醒用ALL避免死锁
} catch (Exception e) {
} finally {
lock.unlock();
}
}
}
Lock接口示例的更多相关文章
- Java多线程(五) Lock接口,ReentranctLock,ReentrantReadWriteLock
在JDK5里面,提供了一个Lock接口.该接口通过底层框架的形式为设计更面向对象.可更加细粒度控制线程代码.更灵活控制线程通信提供了基础.实现Lock接口且使用得比较多的是可重入锁(Reentrant ...
- java多线程Lock接口简介使用与synchronized对比 多线程下篇(三)
前面的介绍中,对于显式锁的概念进行了简单介绍 显式锁的概念,是基于JDK层面的实现,是接口,通过这个接口可以实现同步访问 而不同于synchronized关键字,他是Java的内置特性,是基于JVM的 ...
- Lock接口和ReadWriteLock接口
Lock接口 Lock接口在java.util.concurrent.locks包中,在jdk1.5之后才有. Lock接口有6个方法: void lock(); void lockInterrupt ...
- 并发王者课-铂金1:探本溯源-为何说Lock接口是Java中锁的基础
欢迎来到<并发王者课>,本文是该系列文章中的第14篇. 在黄金系列中,我们介绍了并发中一些问题,比如死锁.活锁.线程饥饿等问题.在并发编程中,这些问题无疑都是需要解决的.所以,在铂金系列文 ...
- php中创建和调用webservice接口示例
php中创建和调用webservice接口示例 这篇文章主要介绍了php中创建和调用webservice接口示例,包括webservice基本知识.webservice服务端例子.webservi ...
- synchronized关键字,Lock接口以及可重入锁ReentrantLock
多线程环境下,必须考虑线程同步的问题,这是因为多个线程同时访问变量或者资源时会有线程争用,比如A线程读取了一个变量,B线程也读取了这个变量,然后他们同时对这个变量做了修改,写回到内存中,由于是同时做修 ...
- 线程同步 Lock接口
同步:★★★★★ 好处:解决了线程安全问题. 弊端:相对降低性能,因为判断锁需要消耗资源,产生了死锁. 定义同步是有前提的: 1,必须要有两个或者两个以上的线程,才需要同步. 2,多个线程必须保证使用 ...
- Java基础知识强化之多线程笔记06:Lock接口 (区别于Synchronized块)
1. 简介 我们讲到了如何使用关键字synchronized来实现同步访问.本文我们继续来探讨这个问题,从Java 5之后,在java.util.concurrent.locks包下提供了另外一种方式 ...
- jdk1.5多线程Lock接口及Condition接口
jdk1.5多线程的实现的方式: jdk1.5之前对锁的操作是隐式的 synchronized(对象) //获取锁 { } //释放锁 jdk1.5锁的操作是显示的:在包java.util.concu ...
随机推荐
- 1.Concurrent概述
- 实验 3:Mininet 实验——测量路径的损耗率
实验目的 在实验 2 的基础上进一步熟悉 Mininet 自定义拓扑脚本,以及与损耗率相关的设 定:初步了解 Mininet 安装时自带的 POX 控制器脚本编写,测试路径损耗率. 实验任务 h0 向 ...
- 并发编程(六)Object类中线程相关的方法详解
一.notify() 作用:唤醒一个正在等待该线程的锁的线程 PS : 唤醒的线程不会立即执行,它会与其他线程一起,争夺资源 /** * Object类的notify()和notifyAll()方法详 ...
- Typora操作总结
Typora 1. Markdown 是一种轻量级标记语言,它允许人们使用易读易写的纯文本格式编写文档 1.1 目录 [toc] 2. 结构类操作 2.1 多级标题 # 一级标题 ...
- 基于C#的内网穿透学习笔记(附源码)
如何让两台处在不同内网的主机直接互连?你需要内网穿透! 上图是一个非完整版内外网通讯图由内网端先发起,内网设备192.168.1.2:6677发送数据到外网时候必须经过nat会转换成 ...
- 【记】《.net之美》之读书笔记(一) C#语言基础
前言 工作之中,我们习惯了碰到任务就直接去实现其业务逻辑,但是C#真正的一些基础知识,在我们久而久之不去了解巩固的情况下,就会忽视掉.我深知自己正一步步走向只知用法却不知原理的深渊,所以工作之余,一直 ...
- Java 内功修炼 之 数据结构与算法(一)
一.基本认识 1.数据结构与算法的关系? (1)数据结构(data structure): 数据结构指的是 数据与数据 之间的结构关系.比如:数组.队列.哈希.树 等结构. (2)算法: 算法指的是 ...
- 【CF1425H】Huge Boxes of Animal Toys 题解
原题链接 题意简介: 已知分别处在 \((-\infty,-1]\) H.\((-1,0)\) .\((0,1)\) .\([1,\infty)\) 的实数的数量(下记为集合 \(A,B,C,D\) ...
- helm部署mysql
如果您的kubernetes已有了helm,那么部署mysql的步骤可以进一步简化,那些原先需要自己动手配置的deployment和service都已集成在chart中,今天就来实战通过helm部署m ...
- P2832 行路难
题面 Link 题目背景 小X来到了山区,领略山林之乐.在他乐以忘忧之时,他突然发现,开学迫在眉睫 题目描述 山区有 \(n\) 座山.山之间有 \(m\) 条羊肠小道,每条连接两座山,只能单向通过, ...