Lock 同步锁
一、
/*
* 一、用于解决多线程安全问题的方式:
*
* synchronized:隐式锁
* 1. 同步代码块
*
* 2. 同步方法
*
* jdk 1.5 后:
* 3. 同步锁 Lock
* 注意:是一个显示锁,需要通过 lock() 方法上锁,必须通过 unlock() 方法进行释放锁
*/
public class TestLock {
public static void main(String[] args) {
Ticket ticket = new Ticket();
new Thread(ticket, "1号窗口").start();
new Thread(ticket, "2号窗口").start();
new Thread(ticket, "3号窗口").start();
}
}
class Ticket implements Runnable{
private int tick = 100;
private Lock lock = new ReentrantLock();
@Override
public void run() {
while(true){
lock.lock(); //上锁
try{
if(tick > 0){
try {
Thread.sleep(200);
} catch (InterruptedException e) {
}
System.out.println(Thread.currentThread().getName() + " 完成售票,余票为:" + --tick);
}
}finally{
lock.unlock(); //无论执行结果如何,最后必须释放锁
}
}
}
}
二、Lock的使用
Lock lock = new ReentrantLock();
lock.lock();
try {
} finally {
lock.unlock();
}
注意 :
A:在finally块中释放锁,目的是保证在获取到锁之后,最终能够被释放
B: 不要将获取锁的过程写在try块中,因为如果在获取锁(自定义锁的实现)时发生了异常,异常抛出的同时,也会导致锁无故释放
三、重入锁
重入锁ReentrantLock,顾名思义,就是支持重进入的锁,它表示该锁能够支持一个线程对 资源的重复加锁
Lock 同步锁的更多相关文章
- JUC--Callable 以及Lock同步锁
/** * 一.创建执行线程的方式三:实现Callable接口.相较于实现Runnable接口方式,方法可以有返回值,并且可以抛出异常 * 二.callable 需要FutureTask实现类的支持. ...
- Lock同步锁
Lock同步锁 一.前言 在Java 5.0 之前,协调共享对象的访问时可以使用的机制只有synchronized 和volatile .Java 5.0 后增加了一些新的机制,但并不是一种替代内置锁 ...
- 7.生产者消费者 案例 (使用Lock 同步锁 方式,使用Condition完成线程之间的通信)
/* * 生产者消费者 案例 (使用Lock 同步锁 方式,使用Condition完成线程之间的通信) * */ public class TestProductorAndConsumerForLoc ...
- Lock同步锁--线程同步
Lock-同步锁 Lock是java5提供的一个强大的线程同步机制--通过显示定义同步锁对象来实现同步.Lock可以显示的加锁.解锁.每次只能有一个线程对lock对象加锁. Lock有ReadLock ...
- 深入分析 Java Lock 同步锁
前言 Java 的锁实现,有 Synchronized 和 Lock.上一篇文章深入分析了 Synchronized 的实现原理:由Java 15废弃偏向锁,谈谈Java Synchronized 的 ...
- Java并发编程之Lock(同步锁、死锁)
这篇文章是接着我上一篇文章来的. 上一篇文章 同步锁 为什么需要同步锁? 首先,我们来看看这张图. 这是一个程序,多个对象进行抢票. package MovieDemo; public class T ...
- python笔记9 线程进程 threading多线程模块 GIL锁 multiprocessing多进程模块 同步锁Lock 队列queue IO模型
线程与进程 进程 进程就是一个程序在一个数据集上的一次动态执行过程.进程一般由程序.数据集.进程控制块三部分组成.我们编写的程序用来描述进程要完成哪些功能以及如何完成:数据集则是程序在执行过程中所需要 ...
- 26 python 初学(线程、同步锁、死锁和递归锁)
参考博客: www.cnblogs.com/yuanchenqi/articles/5733873.html 并发:一段时间内做一些事情 并行:同时做多件事情 线程是操作系统能够进行运算调度的基本单位 ...
- 多线程安全问题之Lock显示锁
package com.hls.juc; import java.util.concurrent.locks.Lock;import java.util.concurrent.locks.Reentr ...
- c#中多线程同步Lock(锁)的研究以及跨线程UI的操作
本文只针对C#中,多线程同步所用到的锁(lock)作为研究对象.由于想更直观的显示结果,所以,在做demo的时候,就把多线程通过事件操作UI的代码也写了出来,留作备忘和分享吧. 其实多线程的同步,使用 ...
随机推荐
- Kotlin:【字符串操作】substring、split、replace、字符串比较==与===、foreach遍历字符
字符串的内存区域问题: 都在常量池内,相同的字符串比较属于同一引用 在字符串常量池开辟了新的内存区域,一共有三个对象,所以引用比较不相等
- 「CF1101F」Trucks and Cities
题意描述 有 \(N\) 座城市,第 \(i\) 座坐标为 \(a_i\) ,有 \(M\) 辆卡车,第 \(i\) 辆卡车要从城市 \(s_i\) 前往城市 \(e_i\) ,每单位长度耗油量为 \ ...
- uni-app封装input组件用于登录
组件 <template> <view> <view class="uni-form-item uni-column"> <input c ...
- 滑动窗口模板在字符串中的巧妙应用|LeetCode 76 最小覆盖子串
LeetCode 76 最小覆盖子串 点此看全部题解 LeetCode必刷100题:一份来自面试官的算法地图(题解持续更新中) 更多干货,请关注公众号[忍者算法],回复[刷题清单]获取完整题解目录- ...
- Binomial Sum 学习笔记
- 表治理-Iceberg小文件合并测试
总结 指标 合并前 合并后(因测试中多次合并,数据会偏多) 查询速度 246秒 13秒 表总大小 9.2G 26.4G 单个文件大小 1-25MB 60MB左右 metadata目录文件数 37 75 ...
- FANUC发那科机器人控制箱维修操作流程
FANUC发那科机器人在工业自动化领域中占有重要地位,其高效.稳定和精确的性能赢得了众多用户的青睐.然而,随着使用时间的增长,可能会出现FANUC机器人控制柜故障,影响到发那科机器人的正常运行.本文将 ...
- 傻妞教程——对接使用redis储存,更快的读写速度
Redis的特点 1.Redis支持数据的持久化,可以将内存中的数据保存在磁盘中. 2.Redis数据读写速度非常快,因为它把数据都读取到内存当中操作. 3.Redis支持数据的备份,即master- ...
- Ansible - [09] 高级语法
error 处理机制 默认 ansible 在遇到 error 会立刻停止 playbook [root@control ansible]# cat ~/ansible/error.yml --- - ...
- 【渗透测试】 Vulnhub JANGOW: 1.0.1
渗透环境 攻击机: IP: 192.168.149.128(Kali) 靶机: IP:192.168.149.129 靶机下载地址:https://www.vulnhub.com/entr ...