解决线程安全问题的方式三:Lock锁 --- JDK5.0新增
Lock( 锁)
从JDK 5.0开始,Java提供了更强大的线程同步机制——通过显式定义同
步锁对象来实现同步。同步锁使用Lock对象充当。
java.util.concurrent.locks.Lock接口是控制多个线程对共享资源进行访问的
工具。锁提供了对共享资源的独占访问,每次只能有一个线程对Lock对象
加锁,线程开始访问共享资源之前应先获得Lock对象。
ReentrantLock 类实现了 Lock ,它拥有与 synchronized 相同的并发性和
内存语义,在实现线程安全的控制中,比较常用的是ReentrantLock,可以
显式加锁、释放锁。

package com.chh.java1; import java.util.concurrent.locks.ReentrantLock; /**
* 解决线程安全问题的方式三:Lock锁 --- JDK5.0新增
*
* 1. 面试题:synchronized 与 Lock的异同?
* 相同:二者都可以解决线程安全问题
* 不同:synchronized机制在执行完相应的同步代码以后,自动的释放同步监视器
* Lock需要手动的启动同步(lock()),同时结束同步也需要手动的实现(unlock())
*
* 2.优先使用顺序:
* Lock 同步代码块(已经进入了方法体,分配了相应资源) 同步方法(在方法体之外)
*
*
* 面试题:如何解决线程安全问题?有几种方式
* @author ch
* @create 2021-02-15 下午 3:38
*/
class Window implements Runnable{ private int ticket = 100;
//1.实例化ReentrantLock
private ReentrantLock lock = new ReentrantLock(); @Override
public void run() {
while(true){
try{ //2.调用锁定方法lock()
lock.lock(); if(ticket > 0){ try {
Thread.sleep(100);
} catch (InterruptedException e) {
e.printStackTrace();
} System.out.println(Thread.currentThread().getName() + ":售票,票号为:" + ticket);
ticket--;
}else{
break;
}
}finally {
//3.调用解锁方法:unlock()
lock.unlock();
} }
}
} public class LockTest {
public static void main(String[] args) {
Window w = new Window(); Thread t1 = new Thread(w);
Thread t2 = new Thread(w);
Thread t3 = new Thread(w); t1.setName("窗口1");
t2.setName("窗口2");
t3.setName("窗口3"); t1.start();
t2.start();
t3.start();
}
}

面试题:synchronized 与 Lock的异同?
* 相同:二者都可以解决线程安全问题
* 不同:synchronized机制在执行完相应的同步代码以后,自动的释放同步监视器 Lock需要手动的启动同步(lock()),
同时结束同步也需要手动的实现(unlock())
解决线程安全问题的方式三:Lock锁 --- JDK5.0新增的更多相关文章
- Java之解决线程安全问题的方式三:Lock锁
import java.util.concurrent.locks.ReentrantLock; /** * 解决线程安全问题的方式三:Lock锁 --- JDK5.0新增 * * 1. 面试题:sy ...
- Lock锁方式解决线程安全问题
在JDK5.0之后新增加了一种更强大的线程同步机制---通过显示定义同步锁来实现线程同步解决线程安全问题.同步锁使用Lock对象充当. java.util.concurrent.locks.lock接 ...
- 静态同步方法和解决线程安全问题_Lock锁
静态的同步方法锁对象是谁?不能是thisthis是创建对象之后产生的,静态方法优先于对象静态方法的锁对象是本类的cLass属性-->class文件对象(反射) 卖票案例出现了线程安全问题 卖出了 ...
- java 22 - 13 多线程之解决线程安全问题的实现方式2
上一章说了,解决线程安全问题的实现方式1是使用同步代码块 同时也知道了,同步代码块的锁对象是任意对象:(Object obj ; Demo d;)这些都行 那么,现在来说解决线程安全问题的实现方式2 ...
- java 22 - 12 多线程之解决线程安全问题的实现方式1
从上一章知道了多线程存在着线程安全问题,那么,如何解决线程安全问题呢? 导致出现问题的原因: A:是否是多线程环境 B:是否有共享数据 C:是否有多条语句操作共享数据 上一章的程序,上面那3条都具备, ...
- java线程安全问题以及使用synchronized解决线程安全问题的几种方式
一.线程安全问题 1.产生原因 我们使用java多线程的时候,最让我们头疼的莫过于多线程引起的线程安全问题,那么线程安全问题到底是如何产生的呢?究其本质,是因为多条线程操作同一数据的过程中,破坏了数据 ...
- 解决线程安全问题_同步方法和解决线程安全问题_Lock锁
解决线程安全问题_同步方法 package com.yang.Test.ThreadStudy; import lombok.SneakyThrows; /** * 卖票案例出现了线程安全的问题 * ...
- java并发之如何解决线程安全问题
并发(concurrency)一个并不陌生的词,简单来说,就是cpu在同一时刻执行多个任务. 而Java并发则由多线程实现的. 在jvm的世界里,线程就像不相干的平行空间,串行在虚拟机中.(当然这是比 ...
- (删)Java线程同步实现二:Lock锁和Condition
在上篇文章(3.Java多线程总结系列:Java的线程同步实现)中,我们介绍了用synchronized关键字实现线程同步.但在Java中还有一种方式可以实现线程同步,那就是Lock锁. 一.同步锁 ...
- 创建线程的方式三:实现Callable接口-----JDK5.0 新增
package com.yhqtv.java2; /* * 创建线程的方式三:实现Callable接口-----JDK5.0 新增 * * 如何理解实现Callable接口的方式创建多线程比实现Run ...
随机推荐
- 如果一个接口不使用token鉴权,应该怎么保持在登录状态下进行测试?
1.token是接口中用于身份验证和授权的令牌,用户通过登录操作,服务器会返回一个token,这个token会在后续的请求中发送到服务器,用来证明用户的身份和权限. 2.如果接口没有token,可以使 ...
- 高性能计算-openmp编程-(探究 for/collapse)(11)
1. 目标:探究嵌套循环 for 和 collapse 编程 2. 内容 (1). for 并行区默认对最近外层的循环控制变量私有,并对其划分并行,不必指明 private,内层循环体入口的循环控制变 ...
- 周末基于 .NET 9 + K8S 写了个 MockHttp
MockHTTP MockHTTP 可以将现有HTTP转换成GET请求,设置cron定时调用,自定义代码去格式化数据,通知到你的邮箱里. 比如每天早上时自动获取博客园文章列表,天气下雨时通知,各类签到 ...
- JS之Class类
转载:https://juejin.cn/post/7098891689955164168 ECMAScript 6 提供了更接近传统语言的写法,新引入的class关键字具有正式定义类的能力.类(cl ...
- 项目监控之sentry
github: https://github.com/getsentry/sentry 1.什么是sentry? 当我们完成一个业务系统的上线时,总是要观察线上的运行情况,对于每一个项目,我们都没办法 ...
- Ubuntu实现SSH外网连接内网(反向隧道)
应用场景: 如果你有Linux云主机(腾讯.华为等),且公司有一台只有内网IP (或动态IP) 的Linux工作机:你计划在家里工作时,通过家里的电脑连接公司的工作机 (且不想使用类似Teamview ...
- 『玩转Streamlit』--表单Form
在Streamlit中,Form组件是一种特殊的UI元素,允许用户输入数据而不立即触发应用的重新运行. 这对于创建需要用户输入多个参数后再进行处理的交互式表单非常有用. 1. 概要 Form组件的主要 ...
- 一个大幅提高开发效率的工具库 WYBasisKit
WYBasisKit (持续更新) WYBasisKit 是做什么的? WYBasisKit 不仅可以帮助开发者快速构建一个工程,还有基于常用网络框架和系统API而封装的各种实用方法.扩展,开发者只需 ...
- C/C++源码扫描系列- Joern 篇
文章首发于 https://xz.aliyun.com/t/9277 概述 和 codeql,Fortify 相比 Joern不需要编译源码即可进行扫描,适用场景和环境搭建方面更加简单. 环境搭建 首 ...
- 《Django 5 By Example》读后感
一. 为什么选择这本书? 本人的工作方向为Python Web方向,想了解下今年该方向有哪些新书出版,遂上packt出版社网站上看了看,发现这本书出版时间比较新(2024年9月),那就它了. 从202 ...