共享受限资源

2024-06-03 19:58
文章标签 共享 资源 受限

本文主要是介绍共享受限资源,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

你可以把单线程程序当作在问题域求解的单一实体,每次只能做一件事情。因为只有一个

实体,所以你永远不用担心诸如“两个实体试图同时使用同一个资源”这样的问题,比如:

两个人在同一个地方停车,两个人同时走过一扇门,甚至是两个人同时说话。

 

在多线程的环境中,可以同时做多件事情。但是,“两个或多个线程同时使用同一个受限资

源”的问题也出现了。必须防止这种资源访问的冲突,否则,就可能发生两个线程同时试图

访问同一个银行帐户,向同一个打印机打印,改变同一个值等诸如此类的问题。

 

 

不正确地访问资源

 

 

考虑下面的例子,这里的类“保证”当你调用getValue( )方法时,总能返回一个偶数。同

时,另外一个名为“Watcher”的线程不断调用getValue( )方法并检查返回值是否真的

为偶数。这看起来好像没什么意义,因为从代码上看,返回值显然是偶数。但这恰恰是令

人惊奇之处。下面是该程序的第一个版本:

 

//: c13:AlwaysEven.java

// Demonstrating thread collision overresources by

// reading an object in an unstableintermediate

state.

 

public     class AlwaysEven {

private      int i;

public     void next() { i++; i++; }

public     int getValue() {            return i; }

public     static       void main(String[] args) {

final AlwaysEven ae =           new AlwaysEven();

newThread("Watcher") {

public     void run() {

while(true){

intval = ae.getValue();

if(val% 2 != 0) {

           System.out.println(val);

           System.exit(0);

         }

       }

      }

   }.start();

while(true)

     ae.next();


 

 

 

  }

///:~

 

在main( )中,建立了一个AlwaysEven对象,它必须是final的,因为它要被一个继承

自Thread的匿名内部类所访问。如果线程读出的值不是偶数,它将把这个值打印出来(以

证明它捕获了对象的不稳定状态)并退出程序。

 

这个例子表明了使用线程会遇到的基本问题。你永远不会知道线程是何时运行的。想象一

下,你坐在座子旁边,手里有一把叉子,准备叉起盘子里最后一块食物,当叉子碰到食物

的时候,它忽然消失了(因为你的线程被挂起,另一个线程跑进来偷走了食物)。这就是

你在写并发程序时要面临的问题。

 

你试图使用一个资源的同时,有时并不关心它是否正在被访问(比如别的盘子里的食物)。

但为了让多线程能工作,你就需要某种方法来防止两个线程访问同一个资源,至少是在某

个关键时间段内避免此问题。

 

要防止这类冲突,只要在线程使用资源的时候给它加一把锁就行了。访问资源的第一个线

程给资源加锁,接着其它线程就只能等到锁被解除以后才能访问资源,这时某个线程就可

以对资源加锁以进行访问。如果把汽车的前排座椅看成是受限资源的话,那么你的小孩大

喊一声“我要坐”,就相当于在声明上锁。


这篇关于共享受限资源的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/1027966

相关文章

通过配置nginx访问服务器静态资源的过程

《通过配置nginx访问服务器静态资源的过程》文章介绍了图片存储路径设置、Nginx服务器配置及通过http://192.168.206.170:8007/a.png访问图片的方法,涵盖图片管理与服务... 目录1.图片存储路径2.nginx配置3.访问图片方式总结1.图片存储路径2.nginx配置

Go语言使用sync.Mutex实现资源加锁

《Go语言使用sync.Mutex实现资源加锁》数据共享是一把双刃剑,Go语言为我们提供了sync.Mutex,一种最基础也是最常用的加锁方式,用于保证在任意时刻只有一个goroutine能访问共享... 目录一、什么是 Mutex二、为什么需要加锁三、实战案例:并发安全的计数器1. 未加锁示例(存在竞态)

redis中session会话共享的三种方案

《redis中session会话共享的三种方案》本文探讨了分布式系统中Session共享的三种解决方案,包括粘性会话、Session复制以及基于Redis的集中存储,具有一定的参考价值,感兴趣的可以了... 目录三种解决方案粘性会话(Sticky Sessions)Session复制Redis统一存储Spr

使用Redis快速实现共享Session登录的详细步骤

《使用Redis快速实现共享Session登录的详细步骤》在Web开发中,Session通常用于存储用户的会话信息,允许用户在多个页面之间保持登录状态,Redis是一个开源的高性能键值数据库,广泛用于... 目录前言实现原理:步骤:使用Redis实现共享Session登录1. 引入Redis依赖2. 配置R

C++中RAII资源获取即初始化

《C++中RAII资源获取即初始化》RAII通过构造/析构自动管理资源生命周期,确保安全释放,本文就来介绍一下C++中的RAII技术及其应用,具有一定的参考价值,感兴趣的可以了解一下... 目录一、核心原理与机制二、标准库中的RAII实现三、自定义RAII类设计原则四、常见应用场景1. 内存管理2. 文件操

Android实现两台手机屏幕共享和远程控制功能

《Android实现两台手机屏幕共享和远程控制功能》在远程协助、在线教学、技术支持等多种场景下,实时获得另一部移动设备的屏幕画面,并对其进行操作,具有极高的应用价值,本项目旨在实现两台Android手... 目录一、项目概述二、相关知识2.1 MediaProjection API2.2 Socket 网络

Linux samba共享慢的原因及解决方案

《Linuxsamba共享慢的原因及解决方案》:本文主要介绍Linuxsamba共享慢的原因及解决方案,具有很好的参考价值,希望对大家有所帮助,如有错误或未考虑完全的地方,望不吝赐教... 目录linux samba共享慢原因及解决问题表现原因解决办法总结Linandroidux samba共享慢原因及解决

Rust中的Drop特性之解读自动化资源清理的魔法

《Rust中的Drop特性之解读自动化资源清理的魔法》Rust通过Drop特性实现了自动清理机制,确保资源在对象超出作用域时自动释放,避免了手动管理资源时可能出现的内存泄漏或双重释放问题,智能指针如B... 目录自动清理机制:Rust 的析构函数提前释放资源:std::mem::drop android的妙

java父子线程之间实现共享传递数据

《java父子线程之间实现共享传递数据》本文介绍了Java中父子线程间共享传递数据的几种方法,包括ThreadLocal变量、并发集合和内存队列或消息队列,并提醒注意并发安全问题... 目录通过 ThreadLocal 变量共享数据通过并发集合共享数据通过内存队列或消息队列共享数据注意并发安全问题总结在 J

解读静态资源访问static-locations和static-path-pattern

《解读静态资源访问static-locations和static-path-pattern》本文主要介绍了SpringBoot中静态资源的配置和访问方式,包括静态资源的默认前缀、默认地址、目录结构、访... 目录静态资源访问static-locations和static-path-pattern静态资源配置