容桂网站制作公司系统类小说

news/2025/9/24 17:35:33/文章来源:
容桂网站制作公司,系统类小说,通辽做网站建设,工厂办公室简单装修类ReentrantLock具有完全互斥排他的效果#xff0c;即同一时间只有一个线程在执行ReentrantLock.lock()后面的代码。这样虽然保证了线程的安全性#xff0c;但是效率低下。JDK提供了ReentrantReadWriteLock读写锁#xff0c;使用它可以加快效率#xff0c;在某些不需要操作…   类ReentrantLock具有完全互斥排他的效果即同一时间只有一个线程在执行ReentrantLock.lock()后面的代码。这样虽然保证了线程的安全性但是效率低下。JDK提供了ReentrantReadWriteLock读写锁使用它可以加快效率在某些不需要操作实例变量的方法中完全可以使用读写锁ReemtrantReadWriteLock来提升该方法的运行速度。   读写锁表示有两个锁一个是读操作相关的锁也称为共享锁另一个是写操作相关的锁也叫排他锁。也就是多个读锁之间不互斥读锁与写锁互斥、写锁与写锁互斥。在没有线程Thread进行写入操作时进行读取操作的多个Thread都可以获取读锁而进行写入操作的Thread只有在获取写锁后才能进行写入操作。即多个Thread可以同时进行读取操作但是同一时刻只允许一个Thread进行写入操作。 1.读读共享   读锁与读锁可以共享这种锁一般用于只读操作不对变量进行修改操作。 package cn.qlq.thread.twelve;import java.util.concurrent.locks.ReentrantReadWriteLock;import org.slf4j.Logger; import org.slf4j.LoggerFactory;import cn.qlq.thread.one.RunnableThread;public class Demo1 {private ReentrantReadWriteLock lock new ReentrantReadWriteLock();// 读写锁private static final Logger log LoggerFactory.getLogger(Demo1.class);private int i;public String readI() {try {lock.readLock().lock();// 占用读锁log.info(threadName - {} 占用读锁,i-{}, Thread.currentThread().getName(), i);Thread.sleep(2 * 1000);} catch (InterruptedException e) {} finally {log.info(threadName - {} 释放读锁,i-{}, Thread.currentThread().getName(), i);lock.readLock().unlock();// 释放读锁}return i ;}public static void main(String[] args) {final Demo1 demo1 new Demo1();Runnable runnable new Runnable() {Overridepublic void run() {demo1.readI();}};new Thread(runnable, t1).start();new Thread(runnable, t2).start();new Thread(runnable, t3).start();}} 结果: 18:27:20 [cn.qlq.thread.twelve.Demo1]-[INFO] threadName - t2 占用读锁,i-018:27:20 [cn.qlq.thread.twelve.Demo1]-[INFO] threadName - t1 占用读锁,i-018:27:20 [cn.qlq.thread.twelve.Demo1]-[INFO] threadName - t3 占用读锁,i-018:27:22 [cn.qlq.thread.twelve.Demo1]-[INFO] threadName - t3 释放读锁,i-018:27:22 [cn.qlq.thread.twelve.Demo1]-[INFO] threadName - t1 释放读锁,i-018:27:22 [cn.qlq.thread.twelve.Demo1]-[INFO] threadName - t2 释放读锁,i-0   2.写写互斥   写锁与写锁互斥这就类似于ReentrantLock的作用效果。 package cn.qlq.thread.twelve;import java.util.concurrent.locks.ReentrantReadWriteLock;import org.slf4j.Logger; import org.slf4j.LoggerFactory;public class Demo2 {private ReentrantReadWriteLock lock new ReentrantReadWriteLock();// 读写锁private static final Logger log LoggerFactory.getLogger(Demo2.class);private int i;public void addI() {try {lock.writeLock().lock();// 占用写锁log.info(threadName - {} 占用写锁,i-{}, Thread.currentThread().getName(), i);Thread.sleep(2 * 1000);i;} catch (InterruptedException e) {} finally {log.info(threadName - {} 释放写锁,i-{}, Thread.currentThread().getName(), i);lock.writeLock().unlock();// 释放写锁}}public static void main(String[] args) {final Demo2 demo1 new Demo2();Runnable runnable new Runnable() {Overridepublic void run() {demo1.addI();}};new Thread(runnable, t1).start();new Thread(runnable, t2).start();new Thread(runnable, t3).start();}} 结果:(从时间可以看出实现了互斥效果) 18:31:31 [cn.qlq.thread.twelve.Demo2]-[INFO] threadName - t1 占用写锁,i-018:31:33 [cn.qlq.thread.twelve.Demo2]-[INFO] threadName - t1 释放写锁,i-118:31:33 [cn.qlq.thread.twelve.Demo2]-[INFO] threadName - t2 占用写锁,i-118:31:35 [cn.qlq.thread.twelve.Demo2]-[INFO] threadName - t2 释放写锁,i-218:31:35 [cn.qlq.thread.twelve.Demo2]-[INFO] threadName - t3 占用写锁,i-218:31:37 [cn.qlq.thread.twelve.Demo2]-[INFO] threadName - t3 释放写锁,i-3   3.读写互斥 package cn.qlq.thread.twelve;import java.util.concurrent.locks.ReentrantReadWriteLock;import org.slf4j.Logger; import org.slf4j.LoggerFactory;/*** 读写互斥* * author Administrator**/ public class Demo3 {private ReentrantReadWriteLock lock new ReentrantReadWriteLock();// 读写锁private static final Logger log LoggerFactory.getLogger(Demo3.class);private int i;public String readI() {try {lock.readLock().lock();// 占用读锁log.info(threadName - {} 占用读锁,i-{}, Thread.currentThread().getName(), i);Thread.sleep(2 * 1000);} catch (InterruptedException e) {} finally {log.info(threadName - {} 释放读锁,i-{}, Thread.currentThread().getName(), i);lock.readLock().unlock();// 释放读锁}return i ;}public void addI() {try {lock.writeLock().lock();// 占用写锁log.info(threadName - {} 占用写锁,i-{}, Thread.currentThread().getName(), i);Thread.sleep(2 * 1000);i;} catch (InterruptedException e) {} finally {log.info(threadName - {} 释放写锁,i-{}, Thread.currentThread().getName(), i);lock.writeLock().unlock();// 释放写锁}}public static void main(String[] args) throws InterruptedException {final Demo3 demo1 new Demo3();new Thread(new Runnable() {Overridepublic void run() {demo1.readI();}}, t1).start();Thread.sleep(1 * 1000);new Thread(new Runnable() {Overridepublic void run() {demo1.addI();}}, t2).start();}} 结果: 18:34:59 [cn.qlq.thread.twelve.Demo3]-[INFO] threadName - t1 占用读锁,i-018:35:01 [cn.qlq.thread.twelve.Demo3]-[INFO] threadName - t1 释放读锁,i-018:35:01 [cn.qlq.thread.twelve.Demo3]-[INFO] threadName - t2 占用写锁,i-018:35:03 [cn.qlq.thread.twelve.Demo3]-[INFO] threadName - t2 释放写锁,i-1   4.写读互斥   写锁与读锁也是互斥的。先占用写锁后读锁进行抢占也会等待写锁释放。 package cn.qlq.thread.twelve;import java.util.concurrent.locks.ReentrantReadWriteLock;import org.slf4j.Logger; import org.slf4j.LoggerFactory;/*** 读写互斥* * author Administrator**/ public class Demo3 {private ReentrantReadWriteLock lock new ReentrantReadWriteLock();// 读写锁private static final Logger log LoggerFactory.getLogger(Demo3.class);private int i;public String readI() {try {lock.readLock().lock();// 占用读锁log.info(threadName - {} 占用读锁,i-{}, Thread.currentThread().getName(), i);Thread.sleep(2 * 1000);} catch (InterruptedException e) {} finally {log.info(threadName - {} 释放读锁,i-{}, Thread.currentThread().getName(), i);lock.readLock().unlock();// 释放读锁}return i ;}public void addI() {try {lock.writeLock().lock();// 占用写锁log.info(threadName - {} 占用写锁,i-{}, Thread.currentThread().getName(), i);Thread.sleep(2 * 1000);i;} catch (InterruptedException e) {} finally {log.info(threadName - {} 释放写锁,i-{}, Thread.currentThread().getName(), i);lock.writeLock().unlock();// 释放写锁}}public static void main(String[] args) throws InterruptedException {final Demo3 demo1 new Demo3();new Thread(new Runnable() {Overridepublic void run() {demo1.addI();}}, t2).start();Thread.sleep(1 * 1000);new Thread(new Runnable() {Overridepublic void run() {demo1.readI();}}, t1).start();}} 结果: 18:36:14 [cn.qlq.thread.twelve.Demo3]-[INFO] threadName - t2 占用写锁,i-018:36:16 [cn.qlq.thread.twelve.Demo3]-[INFO] threadName - t2 释放写锁,i-118:36:16 [cn.qlq.thread.twelve.Demo3]-[INFO] threadName - t1 占用读锁,i-118:36:18 [cn.qlq.thread.twelve.Demo3]-[INFO] threadName - t1 释放读锁,i-1   总结: 读写、写读、写写都是互斥的而读读是异步非互斥的。       也就是只要有写锁的参与就会进行同步所以写锁也被称为排他锁读锁被称为共享锁。   转载于:https://www.cnblogs.com/qlqwjy/p/10158409.html

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

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

相关文章

vue3 + antd +ts cron 选择器使用

https://github.com/shiyzhang/shiyzhang-cron shiyzhang-cron组件 使用方法:npm i shiyzhangcron 或 pnpm i shiyzhangcron 给ts添加类型声明文件在项目根目录下创建 types 文件夹 在 types 文件夹中创建 shiyzhangc…

HarmonyOS 5 性能优化全攻略:从启动加速到内存管理

🚀 一、启动速度优化 应用启动是用户体验的第一印象,优化启动速度至关重要。 1. 冷启动时延优化 通过精简初始化流程和资源预加载,可将启动时间缩短30%-50%。 // LaunchOptimization.ets import TaskPool from @oh…

#字符串执行函数——eval()、exec()和compile()详解

字符串执行函数——eval()、exec()和compile()详解 字符串类型代码的执行函数有三个,都是Python的内置函数。 eval() 执行字符串类型的代码,并返回最终结果。 exec() 执行字符串类型的代码。 #### compile() 将字符…

HarmonyOS 5 网络编程与数据存储实战:从RESTful API到本地持久化

🌐 一、网络编程基础与权限配置 HarmonyOS提供了强大的网络能力,支持HTTP/HTTPS、WebSocket、Socket等协议。 1. 权限声明与配置 在 module.json5中声明网络权限和加密通信权限: {"module": {"requ…

视觉传达设计网站深圳 德 网站建设

主要内容 自定义函数式接口函数式编程常用函数式接口 第一章 函数式接口 概念 函数式接口在java中指的是:有且只有一个抽象方法的接口 函数式接口,即适用于函数式编程场景的接口.而java中共的函数式编程体现就是Lambda,所以函数式接口就是可以适用于lambda使用的接口.只有…

OceanBase 向量数据库使用指南

OceanBase 向量数据库使用指南为了大家更好地使用 OceanBase 向量数据库, OceanBase 中负责研发向量能力的一众研发同学共同为大家写了这篇《OceanBase 向量数据库使用指南》,推荐各位老师收藏本文,以备不时之需。A…

【光照】[环境光ambient]以UnityURP为例

【从UnityURP开始探索游戏渲染】专栏-直达环境光的基本处理流程 $Cambient$‌环境光采集‌:获取场景环境光照信息 ‌环境光遮蔽‌:计算环境光遮挡关系 ‌环境光反射‌:根据材质属性反射环境光 ‌环境光混合‌:与其…

浅谈当前时代下大学生的就业择业及人生规划

浅谈当前时代下大学生的就业择业及人生规划: 叠甲阶段: 我不是专业的人生规划师,也不是手握各大厂资源和offer的人脉大佬。我只是一个在芸芸大学生中的其中一个小透明。眼界与资源都具有局限性。各位佬,同学权当汲…

网站备案一般要多久pr免费模板网站

转载自Thrift在Windows及Linux平台下的安装和使用示例 thrift介绍 Apache Thrift 是 Facebook 实现的一种高效的、支持多种编程语言的RPC(远程服务调用)框架。 本文主要目的是分别介绍在Windows及Linux平台下的Thrift安装步骤,以及实现一个简单的demo演示Thrif…

手把手教你做网站做网站设计的都转行干啥了

一、前言 spring为开发人员提供了两个搜索注解的工具类,分别是AnnotatedElementUtils和AnnotationUtils。在使用的时候,总是傻傻分不清,什么情况下使用哪一个。于是我做了如下的整理和总结。 二、AnnotationUtils官方解释 功能 用于处理注解&…

唐山网站专业制作网站的整体规划怎么写

重要: schema-defined aspects只支持singleton model,即 基于配置文件的aspects只支持单例模式 转载于:https://www.cnblogs.com/JsonShare/p/4638475.html

上传图片做网站维护微信公众号网页授权登录wordpress

题目:从一个由N个整数排列组成的整数序列中,自左向右不连续的选出一组整数,可以组成一个单调减小的子序列(如从{68 69 54 64 68 64 70 67 78 62 98 87}中我们可以选取出{69 68 64 62}这个子序列;当然,这里还有很多其他…

实用指南:玳瑁的嵌入式日记---0923(ARM)

实用指南:玳瑁的嵌入式日记---0923(ARM)pre { white-space: pre !important; word-wrap: normal !important; overflow-x: auto !important; display: block !important; font-family: "Consolas", "…

个人博客搭建记录【hexo】

安装hexo 部署环境Node.js GitNode.js 部署,建议版本大于 12.0Node.js 安装中步骤中需要注意其中两处:Add to PATH 选上,使其集成到系统环境中: ​此处勾选会安装各种编程环境和软件,这对于安装hexo是不必要的: …

喵喵喵

笨蛋循环。笨蛋黑白染色。笨蛋欧拉回路。笨蛋欧拉回路!!笨蛋性质。笨蛋反图。笨蛋典题。笨蛋困难难题目。笨蛋猫猫。笨蛋煎蛋。笨蛋,眼睛瞎了。

Ansible自动化管理 - 指南

Ansible自动化管理 - 指南pre { white-space: pre !important; word-wrap: normal !important; overflow-x: auto !important; display: block !important; font-family: "Consolas", "Monaco", &…

flink不同环境切换 - --

代码: package com.yourcompany.flink; import org.apache.flink.streaming.api.environment.StreamExecutionEnvironment;import java.util.Properties; /** * 最简版 - 所有代码在一个文件中 */public class Minima…

网站原则广州网站开发公司

RabbitMQ:高效的消息队列中间件及其 PHP 实现 一、什么是 RabbitMQ? RabbitMQ 是一个开源的消息队列中间件,使用 Erlang 编写,遵循 AMQP(Advanced Message Queuing Protocol)协议。它的主要功能是提供一种…

ps-填充色

ps-填充色一、填充颜色用矩形选框选中范围; Ctrl + delete:填充背景色; Alt + delete:填充前景色;不将就,不强求!

PythonStudio_圆的面积demo源代码

# Powered By Python Studio, The best Python GUI IDE to download from glsite.com. import os from glcl import *class Form1(Form):def __init__(self, owner):self.Button3 = Button(self)self.Button2 = Button…