C# 多线程中经常访问同一资源可能造成哪些问题
作者:代码描绘人生 发布时间:2022-09-08 05:22:47
标签:C#,多线程,访问,资源
多线程经常访问同一资源可能造成什么问题
竞态条件和死锁
如果两个或多个线程访问相同的对象,或者访问不同步的共享状态 ,就会出现竞态条件;
为了避免出现该问题,可以锁定共享的对象。但是过多的锁定也会有麻烦,那就是死锁;
当至少有两个线程被挂起,等待对方解除锁定。由于两个线程都在等待对方,就出现了死锁,线程将无限等下去;
要避免同步问题,最好不要在线程之间共享数据。当然,这并不总是可行的。如果需要共享数据,就必须使用同步技术;
确保一次只有一个线程访问和改变共享状态。注意,同步问题与竞态条件和死锁有关。如果不注意这些问题,就很难在应用程序中找到问题的原因,因为线程问题是不定期发生的。
多线程同时访问一个实例对象时, 可以给进程加一把锁来处理。
lock是确保当一个线程位于代码的临界区时,另一个线程不进入临界区。
如果其他线程试图进入锁定的代码,则它将一直等待(即被阻止),直到该对象被释放。
public class Singleton
{
private static Singleton instance;
private static readonly object synRoot=new object();
private Singleton() //改为私有
{
}
public static Singleton GetInstance()
{
lock(synRoot)
{
if(instance==null)
{
instance=new Singleton();
}
return instance;
}
}
}
双重锁定:不用让线程每次都加锁,而只是在实例未被创建的时候再加锁处理,提高了性能。
public class Singleton
{
private static Singleton instance;
private static readonly object synRoot=new object();
private Singleton() //改为私有
{
}
public static Singleton GetInstance()
{
if(instance==null)
{
lock(synRoot)
{
if(instance==null)
{
instance=new Singleton();
}
return instance;
}
}
}
}
多线程访问资源冲突问题
多线程访问同一资源时,可以用同步机制解决问题
private Object _lock = new Object();//定义一个对象
private void method( paramtype,paramvalue) //线程访问方法名
{
lock (_lock)
{
//冲突代码
}
}
1. _lock 被lock了吗?没有则由当前线程来lock,否则一直等待,直至_lock 被释放。
2. lock以后在执行lock{}中的代码期间其他线程不能调用lock{}{中的代码,也不能使用_lock。
3. 执行完lock{}中的代码之后释放_lock,并且lock{}中的代码可以被其他线程访问。
来源:https://www.cnblogs.com/testsec/p/6624326.html
0
投稿
猜你喜欢
- 获取方法的相关信息的两种形式反射是一种允许用户获得类信息的C#功能,Type对象映射它代表的底层对象;在.Net 中, 一旦获得了Type对
- 有时候数据库文档需要整理,可是只能手动的复制粘贴,心中一万只草泥马奔腾而过。。。screw简洁好用的数据库表结构文档生成工具。1. 创建项目
- Spring中提供了很多PostProcessor供开发者进行拓展,例如:BeanPostProcessor、BeanFactoryPost
- 本文实例讲述了C#创建临时文件的方法。分享给大家供大家参考。具体分析如下:C#可以通过Path.GetTempFileName获得一个临时文
- 前言Zuul 是Netflix 提供的一个开源组件,致力于在云平台上提供动态路由,监控,弹性,安全等边缘服务的框架。也有很多公司使用它来作为
- 本文基于jdk1.8进行分析。LinkedList和ArrayList都是常用的java集合。ArrayList是数组,Linkedlist
- Java代码package com.zzx.controller;import com.zzx.model.User;import org.
- 1.例题题目描述迷宫由 n 行 m 列的单元格组成,每个单元格要么是空地,要么是障碍物。其中1表示空地,可以走通,2表示障碍物。给定起点坐标
- Maven可以使用mvn package指令对项目进行打包,如果使用java -jar xxx.jar执行运行jar文件,会出现"
- 1、注解@PathVariable:将请求url中的占位符参数与控制器方法入参绑定起来(Rest风格请求)@RequestHeader:获取
- 修改FeginCilent定义的服务名到指定服务通过覆盖类来修改对应的服务名,这里将所有的FeginClient对应的服务名都修改好。pac
- 序言springboot框架价值,可以简单快速的构建独立的spring生产级别应用。springboot主要有以下的特性:1.创建独立的Sp
- 1、什么是Spring MVC?Spring MVC是一种基于Java的实现了Web MVC设计模式的请求驱动类型的轻量级Web框架,即使用
- 建库建表DROP DATABASE IF EXISTS mp;CREATE DATABASE mp DEFAULT CHARACTER SE
- 开发背景开发工具:VS2017语言:C#DotNet版本:.Net FrameWork 4.0及以上系统:Win10 X64一、首先建立一个
- ${project.basedir}的使用<project> 是 pom.xml 的根节点,project.basedir 就是
- 一、前言通过前面我们也知道,通过getMapper方式来进行查询,最后会通过mapperMehod类,对接口中传来的参数也会在这个类里面进行
- 我是因为构建多渠道包的时候有这个需求,平常工作多个渠道包频繁的打包,总会忘记versioncode提高一下,从而打包出来的apk无法覆盖原先
- fastjson转换对象实体@JsonProperty不生效项目场景请求第三方应用 返回json数据问题描述第三方返回的数据中,存在java
- C# 的类型系统可分为两种类型,一是值类型,一是引用类型,这个每个C#程序员都了解。还有托管堆,栈,ref,out等等概念也是每个C#程序员