首先需要在项目依赖Cargo.toml添加lazy_static依赖项

[dependencies]
lazy_static = "1.4.0"

示例代码如下:

use lazy_static::lazy_static;
use std::sync::{RwLock, RwLockReadGuard, RwLockWriteGuard};
use std::thread; #[derive(Debug)]
struct SharedData {
version: i32,
data: Vec<u8>,
} impl SharedData {
fn new() -> Self {
SharedData {
version: 0,
data: Vec::new(),
}
} fn display(&self) {
println!("{:?}", self);
} fn add_version(&mut self) {
self.version = self.version + 1;
} fn add_item(&mut self, item: u8) {
self.data.push(item);
self.add_version();
} fn remove_item(&mut self, item: u8) {
self.data.retain(|&x| x != 42);
self.add_version();
}
} lazy_static! {
static ref GLOBAL_DATA: RwLock<SharedData> = RwLock::new(SharedData::new());
} fn get_write_shared_data() -> RwLockWriteGuard<'static, SharedData> {
GLOBAL_DATA.write().unwrap()
} fn get_read_shared_data() -> RwLockReadGuard<'static, SharedData> {
GLOBAL_DATA.read().unwrap()
} fn main() {
// 读取最初的数据
thread::spawn(|| {
let shared_data = get_read_shared_data();
shared_data.display();
})
.join()
.unwrap(); // 添加一个元素
thread::spawn(|| {
let mut shared_data = get_write_shared_data();
shared_data.add_item(42);
})
.join()
.unwrap(); // 读取修改后的数据
thread::spawn(|| {
let shared_data = get_read_shared_data();
shared_data.display();
})
.join()
.unwrap(); // 移除一个元素
thread::spawn(|| {
let mut shared_data = get_write_shared_data();
shared_data.remove_item(42);
})
.join()
.unwrap(); // 读取修改后的数据
thread::spawn(|| {
let shared_data = get_read_shared_data();
shared_data.display();
})
.join()
.unwrap();
}

rust使用lazy_static对全局变量多线程并发读写示例的更多相关文章

  1. android 多线程数据库读写分析与优化

    最新需要给软件做数据库读写方面的优化,之前无论读写,都是用一个 SQLiteOpenHelper.getWriteableDataBase() 来操作数据库,现在需要多线程并发读写,项目用的是2.2的 ...

  2. Java多线程并发编程一览笔录

    线程是什么? 线程是进程中独立运行的子任务. 创建线程的方式 方式一:将类声明为 Thread 的子类.该子类应重写 Thread 类的 run 方法 方式二:声明实现 Runnable 接口的类.该 ...

  3. Java 多线程并发编程面试笔录一览

    知识体系图: 1.线程是什么? 线程是进程中独立运行的子任务. 2.创建线程的方式 方式一:将类声明为 Thread 的子类.该子类应重写 Thread 类的 run 方法 方式二:声明实现 Runn ...

  4. Java 多线程并发编程一览笔录

    Java 多线程并发编程一览笔录 知识体系图: 1.线程是什么? 线程是进程中独立运行的子任务. 2.创建线程的方式 方式一:将类声明为 Thread 的子类.该子类应重写 Thread 类的 run ...

  5. 多线程并发同一个表问题(li)

    现有数据库开发过程中对事务的控制.事务锁.行锁.表锁的发现缺乏必要的方法和手段,通过以下手段可以丰富我们处理开发过程中处理锁问题的方法.For Update和For Update of使用户能够锁定指 ...

  6. Java面试题整理一(侧重多线程并发)

    1..是否可以在static环境中访问非static变量? 答:static变量在Java中是属于类的,它在所有的实例中的值是一样的.当类被Java虚拟机载入的时候,会对static变量进行初始化.如 ...

  7. 并发读写缓存实现机制(一):为什么ConcurrentHashMap可以这么快?

    大家都知道ConcurrentHashMap的并发读写速度很快,但为什么它会这么快?这主要归功于其内部数据结构和独特的hash运算以及分离锁的机制.做游戏性能很重要,为了提高数据的读写速度,方法之一就 ...

  8. 由获取微信access_token引出的Java多线程并发问题

    背景: access_token是公众号的全局唯一票据,公众号调用各接口时都需使用access_token.开发者需要进行妥善保存.access_token的存储至少要保留512个字符空间.acces ...

  9. Qunar机票技术部就有一个全年很关键的一个指标:搜索缓存命中率,当时已经做到了>99.7%。再往后,每提高0.1%,优化难度成指数级增长了。哪怕是千分之一,也直接影响用户体验,影响每天上万张机票的销售额。 在高并发场景下,提供了保证线程安全的对象、方法。比如经典的ConcurrentHashMap,它比起HashMap,有更小粒度的锁,并发读写性能更好。线程安全的StringBuilder取代S

    Qunar机票技术部就有一个全年很关键的一个指标:搜索缓存命中率,当时已经做到了>99.7%.再往后,每提高0.1%,优化难度成指数级增长了.哪怕是千分之一,也直接影响用户体验,影响每天上万张机 ...

  10. linux多线程并发

    多线程并发 进程和线程的概念 进程 进程包括程序映象.地址空间等要素.内核采用PCB来管理进程.进程是内核进行调度的基本单元,每个独立的进程都有自己的代码段.数据段以及堆栈,它们有自己的虚拟地址空间, ...

随机推荐

  1. 计网学习笔记九 Routing Fundamentals

    在这一讲开始讲路由器的控制平面.简单介绍了routing,两个最小cost算法. 参考看的文章: VC网络中的路由 VC网络和数据报网络中路由的区别:Differences between Virtu ...

  2. NC50454 A Simple Problem with Integers

    题目链接 题目 题目描述 给定数列 \(a[1],a[2], \dots,a[n]\) ,你需要依次进行q个操作,操作有两类: 1 l r x:给定l,r,x,对于所有 \(i \in[l,r]\) ...

  3. 【Unity3D】UGUI之InputField

    1 InputField 属性面板 ​ 在 Hierarchy 窗口右键,选择 UI 列表里的 InputField(输入框)控件,即可创建 InputField 控件,选中创建的 InputFiel ...

  4. MySQL日志:slow query log

    ySQL的慢查询日志可以用来找出执行时间过长的查询语句,并进行针对性的优化.   一.slow log相关参数 以下参数都是动态参数,可以在实例运行时修改. slow_query_log=1 #是否启 ...

  5. java使用Timer定时器在指定时间执行程序

    下面是一个利用Timer定时器在每天指定时间执行批处理程序的例子. 有关 java.util.Timer 详细知识请参考API. 值得注意的一点是Timer是单线程顺序执行多个任务的. package ...

  6. 使用marquee标签实现文字滚动

    代码: <!DOCTYPE html> <html lang="en"> <head> <meta charset="UTF-8 ...

  7. docker启动nginx https自签名证书配置

    启动测试应用时, 有时需要自己配置证书签名: 1 使用系统自带openssl openssl req \ > -x509 \ > -nodes \ > -days 365 \ > ...

  8. dpt-shell 抽取壳实现原理分析(执行逻辑)

    开源项目位置(为大佬开源精神点赞) https://github.com/luoyesiqiu/dpt-shell 抽取壳分为两个步骤 加壳逻辑: 一 对apk进行解析,将codeItem抽出到一个文 ...

  9. [WEB安全] XSS攻击防御 Vue

    一.概念 XSS攻击通常指的是通过利用网页开发时留下的漏洞,通过巧妙的方法注入恶意指令代码到网页,使用户加载并执行攻击者恶意制造的网页程序. 这些恶意网页程序通常是JavaScript,但实际上也可以 ...

  10. 基于Python GDAL为长时间序列遥感图像绘制时相变化曲线图

      本文介绍基于Python中gdal模块,对大量多时相栅格图像,批量绘制像元时间序列折线图的方法.   首先,明确一下本文需要实现的需求:现有三个文件夹,其中第一个文件夹存放了某一研究区域原始的多时 ...