永久免费影视建站程序物流平台

web/2025/9/26 19:41:38/文章来源:
永久免费影视建站程序,物流平台,公司规划发展计划书,网上引流推广有哪些软件1.简介 在许多情况下#xff0c;使用隐式锁定就足够了。 有时#xff0c;我们将需要更复杂的功能。 在这种情况下#xff0c; java.util.concurrent.locks包为我们提供了锁定对象。 当涉及到内存同步时#xff0c;这些锁的内部机制与隐式锁相同。 区别在于显式锁提供了其他… 1.简介 在许多情况下使用隐式锁定就足够了。 有时我们将需要更复杂的功能。 在这种情况下 java.util.concurrent.locks包为我们提供了锁定对象。 当涉及到内存同步时这些锁的内部机制与隐式锁相同。 区别在于显式锁提供了其他功能。 与隐式同步相比主要优点或改进是 通过读取或写入来分离锁。 一些锁允许并发访问共享资源 ReadWriteLock 。 获取锁的不同方式 阻塞lock 2.锁对象的分类 锁定对象实现以下两个接口之一 Lock 定义锁对象必须实现的基本功能。 基本上这意味着获取和释放锁。 与隐式锁相反此锁允许以非阻塞或可中断的方式除阻塞方式外获取锁。 主要实现 重入锁 ReadWriteLock 它保留一对锁一个锁用于只读操作另一个锁用于写操作。 读锁可以由不同的读取器线程同时获取只要写锁尚未获取资源而写锁是互斥的。 这样只要没有写操作我们就可以让多个线程同时读取资源。 主要实现 重入ReadWriteLock 下面的类图显示了不同锁类之间的关系 3.重入锁 此锁的工作方式与同步块相同。 只要一个线程尚未被另一个线程获取它就会获取该锁并且直到调用unlock之前它才会释放该锁。 如果另一个线程已经获取了该锁则尝试获取该锁的线程将被阻塞直到另一个线程释放它为止。 我们将从一个没有锁的简单示例开始然后我们将添加一个可重入锁以查看其工作方式。 public class NoLocking {public static void main(String[] args) {Worker worker new Worker();Thread t1 new Thread(worker, Thread-1);Thread t2 new Thread(worker, Thread-2);t1.start();t2.start();}private static class Worker implements Runnable {Overridepublic void run() {System.out.println(Thread.currentThread().getName() - 1);System.out.println(Thread.currentThread().getName() - 2);System.out.println(Thread.currentThread().getName() - 3);}} } 由于上面的代码未同步因此线程将被交错。 让我们看一下输出 Thread-2 - 1 Thread-1 - 1 Thread-1 - 2 Thread-1 - 3 Thread-2 - 2 Thread-2 - 3 现在我们将添加一个可重入锁以序列化对run方法的访问 public class ReentrantLockExample {public static void main(String[] args) {Worker worker new Worker();Thread t1 new Thread(worker, Thread-1);Thread t2 new Thread(worker, Thread-2);t1.start();t2.start();}private static class Worker implements Runnable {private final ReentrantLock lock new ReentrantLock();Overridepublic void run() {lock.lock();try {System.out.println(Thread.currentThread().getName() - 1);System.out.println(Thread.currentThread().getName() - 2);System.out.println(Thread.currentThread().getName() - 3);} finally {lock.unlock();}}} } 上面的代码将安全地执行而不会交错线程。 您可能意识到我们可以使用同步块并且效果是相同的。 现在出现的问题是可重入锁提供给我们什么好处 下面介绍了使用这种类型的锁的主要优点 通过实现Lock接口提供了获取锁的其他方式 lockInterruptible 如果另一个线程拥有锁则当前线程将尝试获取解除锁定并被阻塞例如使用lock方法。 ReentrantLock类提供的其他方法主要用于监视或测试。 例如 getHoldCount或isHeldByCurrentThread方法。 让我们看一个使用tryLock的示例然后再继续下一个锁类。 3.1尝试获取锁 在下面的示例中我们有两个线程试图获取相同的两个锁。 一个线程获取lock2 然后阻止尝试获取lock1 public void lockBlocking() {LOGGER.info({}|Trying to acquire lock2..., Thread.currentThread().getName());lock2.lock();try {LOGGER.info({}|Lock2 acquired. Trying to acquire lock1..., Thread.currentThread().getName());lock1.lock();LOGGER.info({}|Both locks acquired, Thread.currentThread().getName());} finally {lock1.unlock();lock2.unlock();} } 另一个线程获取lock1 然后尝试获取lock2 。 public void lockWithTry() {LOGGER.info({}|Trying to acquire lock1..., Thread.currentThread().getName());lock1.lock();try {LOGGER.info({}|Lock1 acquired. Trying to acquire lock2..., Thread.currentThread().getName());boolean acquired lock2.tryLock(4, TimeUnit.SECONDS);if (acquired) {try {LOGGER.info({}|Both locks acquired, Thread.currentThread().getName());} finally {lock2.unlock();}}else {LOGGER.info({}|Failed acquiring lock2. Releasing lock1, Thread.currentThread().getName());}} catch (InterruptedException e) {//handle interrupted exception} finally {lock1.unlock();} } 使用标准锁定方法这将导致死锁因为每个线程将永远等待另一个线程释放该锁。 但是这次我们尝试使用tryLock指定超时来获取它。 如果四秒钟后仍未成功它将取消操作并释放第一把锁。 这将允许另一个线程解锁并获得两个锁。 让我们看完整的例子 public class TryLock {private static final Logger LOGGER LoggerFactory.getLogger(TryLock.class);private final ReentrantLock lock1 new ReentrantLock();private final ReentrantLock lock2 new ReentrantLock();public static void main(String[] args) {TryLock app new TryLock();Thread t1 new Thread(new Worker1(app), Thread-1);Thread t2 new Thread(new Worker2(app), Thread-2);t1.start();t2.start();}public void lockWithTry() {LOGGER.info({}|Trying to acquire lock1..., Thread.currentThread().getName());lock1.lock();try {LOGGER.info({}|Lock1 acquired. Trying to acquire lock2..., Thread.currentThread().getName());boolean acquired lock2.tryLock(4, TimeUnit.SECONDS);if (acquired) {try {LOGGER.info({}|Both locks acquired, Thread.currentThread().getName());} finally {lock2.unlock();}}else {LOGGER.info({}|Failed acquiring lock2. Releasing lock1, Thread.currentThread().getName());}} catch (InterruptedException e) {//handle interrupted exception} finally {lock1.unlock();}}public void lockBlocking() {LOGGER.info({}|Trying to acquire lock2..., Thread.currentThread().getName());lock2.lock();try {LOGGER.info({}|Lock2 acquired. Trying to acquire lock1..., Thread.currentThread().getName());lock1.lock();LOGGER.info({}|Both locks acquired, Thread.currentThread().getName());} finally {lock1.unlock();lock2.unlock();}}private static class Worker1 implements Runnable {private final TryLock app;public Worker1(TryLock app) {this.app app;}Overridepublic void run() {app.lockWithTry();}}private static class Worker2 implements Runnable {private final TryLock app;public Worker2(TryLock app) {this.app app;}Overridepublic void run() {app.lockBlocking();}} } 如果执行代码将产生以下输出 13:06:38,654|Thread-2|Trying to acquire lock2... 13:06:38,654|Thread-1|Trying to acquire lock1... 13:06:38,655|Thread-2|Lock2 acquired. Trying to acquire lock1... 13:06:38,655|Thread-1|Lock1 acquired. Trying to acquire lock2... 13:06:42,658|Thread-1|Failed acquiring lock2. Releasing lock1 13:06:42,658|Thread-2|Both locks acquired 在第四行之后每个线程都已获取一个锁并且在尝试获取另一个锁时被阻塞。 在下一行您会注意到四秒钟的间隔。 自超时以来第一个线程无法获取锁并释放它已经获取的锁从而允许第二个线程继续。 4. ReentrantReadWriteLock 这种类型的锁保留一对内部锁 ReadLock和WriteLock 。 如接口所述此锁允许多个线程同时从资源读取。 当资源具有频繁读取但很少写入的资源时这特别方便。 只要没有需要写的线程资源就将被并发访问。 以下示例显示了三个线程同时从共享资源读取。 当第四个线程需要写入时它将排他地锁定资源从而防止读取线程在写入时访问该资源。 一旦写入完成并释放了锁定所有读取器线程将继续并发访问资源 public class ReadWriteLockExample {private static final Logger LOGGER LoggerFactory.getLogger(ReadWriteLockExample.class);final ReadWriteLock readWriteLock new ReentrantReadWriteLock();private Data data new Data(default value);public static void main(String[] args) {ReadWriteLockExample example new ReadWriteLockExample();example.start();}private void start() {ExecutorService service Executors.newFixedThreadPool(4);for (int i0; i3; i) service.execute(new ReadWorker());service.execute(new WriteWorker());service.shutdown();}class ReadWorker implements Runnable {Overridepublic void run() {for (int i 0; i 2; i) {readWriteLock.readLock().lock();try {LOGGER.info({}|Read lock acquired, Thread.currentThread().getName());Thread.sleep(3000);LOGGER.info({}|Reading data: {}, Thread.currentThread().getName(), data.getValue());} catch (InterruptedException e) {//handle interrupted} finally {readWriteLock.readLock().unlock();}}}}class WriteWorker implements Runnable {Overridepublic void run() {readWriteLock.writeLock().lock();try {LOGGER.info({}|Write lock acquired, Thread.currentThread().getName());Thread.sleep(3000);data.setValue(changed value);LOGGER.info({}|Writing data: changed value, Thread.currentThread().getName());} catch (InterruptedException e) {//handle interrupted} finally {readWriteLock.writeLock().unlock();}}} } 控制台输出显示结果 11:55:01,632|pool-1-thread-1|Read lock acquired 11:55:01,632|pool-1-thread-2|Read lock acquired 11:55:01,632|pool-1-thread-3|Read lock acquired 11:55:04,633|pool-1-thread-3|Reading data: default value 11:55:04,633|pool-1-thread-1|Reading data: default value 11:55:04,633|pool-1-thread-2|Reading data: default value 11:55:04,634|pool-1-thread-4|Write lock acquired 11:55:07,634|pool-1-thread-4|Writing data: changed value 11:55:07,634|pool-1-thread-3|Read lock acquired 11:55:07,635|pool-1-thread-1|Read lock acquired 11:55:07,635|pool-1-thread-2|Read lock acquired 11:55:10,636|pool-1-thread-3|Reading data: changed value 11:55:10,636|pool-1-thread-1|Reading data: changed value 11:55:10,636|pool-1-thread-2|Reading data: changed value 如您所见当编写器线程获得写锁定线程4时其他任何线程都无法访问该资源。 5.结论 这篇文章展示了显式锁的主要实现方式并解释了与隐式锁有关的一些改进功能。 这篇文章是Java Concurrency Tutorial系列的一部分。 检查此处以阅读本教程的其余部分。 您可以在Github上找到源代码。 翻译自: https://www.javacodegeeks.com/2015/02/java-concurrency-tutorial-locking-explicit-locks.html

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/web/82353.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

网站推广网站嘉定网站设计制作价格

实验五 Branch-Target Buffers 本次实验的主要目的是加深对Branch-Target Buffers的理解。掌握使用Branch-Target Buffers减少或增加分支带来的延迟的情况。 实验内容: 将以下程序段修改为可利用WinMIPS64模拟器运行的程序。假设R3的初始值为R240 在使用forward…

企业网站如何进行seowordpress一键登录

1.摘要 本文介绍了一个基于人脸识别技术的发型推荐系统的实现与分析。该系统利用Python编程语言和相关库,结合Face人脸识别API,实现了用户上传照片后的性别识别、脸型分析和发型推荐功能。首先,用户通过Tkinter GUI界面选择上传照片&#xff…

资源网站搭建重庆网址大全

文章目录1. 训练,验证,测试集2. 偏差,方差3. 机器学习基础4. 正则化5. 为什么正则化预防过拟合6. dropout(随机失活)正则化7. 理解 dropout8. 其他正则化9. 归一化输入10. 梯度消失 / 梯度爆炸11. 神经网络权重初始化1…

网站诊断案例能自己做二次元人物的网站

文章目录 表级锁和行级锁了解吗?有什么区别?行级锁使用有什么注意事项?InnoDB有哪几类行锁?共享锁和排他锁是什么?意向锁有什么用? 锁是一种常见的并发事务的控制方式 表级锁和行级锁了解吗?有什…

查 网站接入服务提供者名称大冶市城乡建设局网站

Adobe After Effects是一款专业级别的视觉效果和动态图形处理软件,由Adobe Systems开发。它被广泛用于电影、电视节目、广告和其他多媒体项目的制作。 After Effects提供了强大的合成和特效功能,可以让用户创建出令人惊艳的动态图形和视觉效果。用户可以…

天津建设网网站打不开网站建设和建议

本文主要是介绍python图形界面上的按键与实际功能的对接,其实编程掌握了基础之后的学习应该都是靠自己去挖掘其他的在网上发现多半教程都是2的,故本文使用的是python3.5,其实也没什么区别,就有一些支持库改变而已首先我们使用pyth…

潍坊公司网站制作网络平台推广广告费用

近期使用加密狗对软件进行加密,但是软件用的c#,这就比较坑了,因为c#自带的System.Security.Cryptography只支持c#格式的公钥加密私钥解密,而现在需要私钥加密公钥解密。于是网上进行资料查找,一堆资料说的都是使用Boun…

广州定制型网站建设建个商场网站

Sqoop是一个用于在Hadoop和关系型数据库之间传输数据的开源工具。它可以将结构化数据从关系型数据库(如MySQL、Oracle、SQL Server等)导入到Hadoop的分布式文件系统(HDFS)或hive中,并且可以将数据从HDFS、hive导出到关…

国内最好的网站建设cdr 做网站

文章目录 0 前言1 基于YOLO的火焰检测与识别2 课题背景3 卷积神经网络3.1 卷积层3.2 池化层3.3 激活函数:3.4 全连接层3.5 使用tensorflow中keras模块实现卷积神经网络 4 YOLOV54.1 网络架构图4.2 输入端4.3 基准网络4.4 Neck网络4.5 Head输出层 5 数据集准备5.1 数…

做ae动图的网站中秋节网页设计素材

分享一种开发中遇到的比较方便的表格高度自适应方案 template代码 <div class"page"><div class"table_wrap"><el-table></el-table></div> </div>css代码 将el-table设置为绝对定位&#xff0c;相对于父元素定位且…

建设部住房城乡建设厅网站我国大宗商品交易所

课程地址和说明 线性代数实现p4 本系列文章是我学习李沐老师深度学习系列课程的学习笔记&#xff0c;可能会对李沐老师上课没讲到的进行补充。 本节是第二篇 矩阵计算 矩阵的导数运算 此处参考了视频&#xff1a;矩阵的导数运算 为了方便看出区别&#xff0c;我将所有的向量…

开一个网站建设公司需要什么网站建设后台实训体会

笔记目录 渗透测试工具(1)wireshark渗透测试工具(2)Nmap渗透测试工具(3)BurpsuiteAWD比赛(1)AWD入门攻略大纲 1.工具简介 (1)定义 ①功能 网络扫描和嗅探工具包&#xff0c;三个主要基本功能&#xff1a; 探测一组主机是否在线 扫描主机端口、嗅探所提供的网络服务 推断出主…

微信公众号要钱吗自动优化网站建设咨询

了解数据结构的人应该都听说过哈希表这种数据结构&#xff0c;它是一种典型的利用键值对存储并检索数据的一种非线性结构&#xff0c;又称散列表或杂凑法。在一般的线性表结构中&#xff0c;数据的相对位置是随机的&#xff0c;即数据和用于检索的关键字之间不存在确定的关系&a…

一站式企业服务北京网站开发制作公司

昨日任务  对于关于我界面的 关于我们 的界面。今日任务完成功能介绍界面以及转换&#xff0c;并且在功能介绍界面增加特效&#xff0c;获取本机的时间&#xff0c;年月日星期几小时分钟 秒&#xff0c;可以看时间。明日任务完成联系我们的功能。困难在增加特效功能中一直获…

网站建设工单系统宣传片制作标准参数

FreeRTOS学习笔记——四、任务的定义与任务切换的实现 0 前言1 什么是任务2 创建任务2.1 定义任务栈2.2 定义任务函数2.3 定义任务控制块2.4 实现任务创建函数2.4.1 任务创建函数 —— xTaskCreateStatic()函数2.4.2 创建新任务——prvInitialiseNewTask()函数2.4.3 初始化任务…

浙江建设职业技术学院招生网站重庆装修公司口碑排名

在博客文章JAXB和Log4j XML配置文件中 &#xff0c;我讨论了“与使用JAXB通过Java类处理[Log4j 1.x和Log4j 2.x] XML配置文件相关的细微差别。” 在本文中&#xff0c;我将探讨另一个与通过Log4j 2.x XML Schema文件Log4j-config.xsd生成的JAXB对象生成Log4j 2.x配置XML相关的挑…

电商学习网站洛阳市做网站的

CORS 全称是跨域资源共享&#xff08;Cross-Origin Resource Sharing&#xff09;&#xff0c;是一种 AJAX 跨域请求资源的方式&#xff0c;支持现代浏览器&#xff0c;IE支持10以上。 CORS与JSONP的使用目的相同&#xff0c;但是比JSONP更强大。JSONP只支持GET请求&#xff0c…

电子相册在线制作网站萍乡专业的企业网站建设公司

C语言一维数组的定义一般形式类型符 数组名[常量表达式]C语言使用一维数组注意事项数组名的命名规则和变量名相同&#xff0c;遵循标识符命名规则。在定义数组时&#xff0c;需要指定数组中元素的个数&#xff0c;方括号中的常量表达式用来表示元素的个数&#xff0c;即数组长度…

办公内网网站建设标准医院网站云服务器配置

展开全部1、问62616964757a686964616fe4b893e5b19e31333433633530题主要是类型的问题。因为a 是int型的&#xff0c;在计算的时候不转型成浮点型是不对的(1/a0)因此要写成&#xff1a;pipi1.0/(2*a-1);pipi-1.0/(2*a-1);还有判断条件&#xff1a;while ((1.0/a)>1e-4);另外&…

建设电子商务网站考核试卷网站建设可以学吗

k8s 实战 常见异常事件 event 及解决方案分享 集群相关 Coredns容器或local-dns容器 重启集群中的coredns组件发生重启(重新创建)&#xff0c;一般是由于coredns组件压力较大导致oom&#xff0c;请检查业务是否异常&#xff0c;是否存在应用容器无法解析域名的异常。如果是l…