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{}中的代码可以被其他线程访问。

以上为个人经验,希望能给大家一个参考,也希望大家多多支持我们。

(0)

相关推荐

  • C#中Thread(线程)和Task(任务)实例详解

    目录 线程 一,使用Thread类启动线程和数据传输 二,线程池ThreadPool类 任务 一,创建并启动任务 二,连续任务 三,资源冲突问题 总结 线程 线程:对于所有需要等待的操作,例如移动文件,数据库和网络访问都需要一定的时间,此时就可以启动一个新的线程,同时完成其他任务.一个进程的多个线程可以同时运行在不同的CPU上或多核CPU的不同内核上. 一个应用程序启动时,会启动一个进程(应用程序的载体),然后进程会启动多个线程. 一,使用Thread类启动线程和数据传输 使用Thread类可以

  • c#中多线程访问winform控件的若干问题小结

    我们在做winform应用的时候,大部分情况下都会碰到使用多线程控制界面上控件信息的问题.然而我们并不能用传统方法来解决这个问题,下面我将详细的介绍. 首先来看传统方法: 复制代码 代码如下: public partial class Form1 : Form     {        public Form1()        {            InitializeComponent();        } private void Form1_Load(object sender,

  • 深入了解C#多线程安全

    目录 什么是多线程安全? 多线程安全示例 1. 多线程不安全示例1 2. 多线程不安全示例2 加锁lock 加锁原理 为何锁对象要用私有类型? 为什么锁对象要用static类型? 加锁锁定的是什么? 泛型锁对象 递归加锁 前面两篇文章,分别简述了多线程的使用和发展历程,但是使用多线程无法避免的一个问题就是多线程安全.那什么是多线程安全?如何解决多线程安全?本文主要通过一些简单的小例子,简述多线程相关的问题,仅供学习分享使用,如有不足之处,还请指正. 什么是多线程安全? 一段程序,单线程和多线程执

  • 详解c# 线程同步

    一.线程同步概述 前面的文章都是讲创建多线程来实现让我们能够更好的响应应用程序,然而当我们创建了多个线程时,就存在多个线程同时访问一个共享的资源的情况,在这种情况下,就需要我们用到线程同步,线程同步可以防止数据(共享资源)的损坏. 然而我们在设计应用程序还是要尽量避免使用线程同步, 因为线程同步会产生一些问题: 1. 它的使用比较繁琐.因为我们要用额外的代码把多个线程同时访问的数据包围起来,并获取和释放一个线程同步锁,如果我们在一个代码块忘记获取锁,就有可能造成数据损坏. 2. 使用线程同步会影

  • C# 多线程中经常访问同一资源可能造成哪些问题

    目录 多线程经常访问同一资源可能造成什么问题 竞态条件和死锁 多线程访问资源冲突问题 多线程经常访问同一资源可能造成什么问题 竞态条件和死锁 如果两个或多个线程访问相同的对象,或者访问不同步的共享状态 ,就会出现竞态条件: 为了避免出现该问题,可以锁定共享的对象.但是过多的锁定也会有麻烦,那就是死锁: 当至少有两个线程被挂起,等待对方解除锁定.由于两个线程都在等待对方,就出现了死锁,线程将无限等下去: 要避免同步问题,最好不要在线程之间共享数据.当然,这并不总是可行的.如果需要共享数据,就必须使

  • Spring Boot访问静态资源css/js,你真的懂了吗

    一.前言 我们用 Spring Boot 搭建 Web 应用时(如搭建一个博客),经常需要在 Html 中访问一些静态资源,比如: css 样式: js 脚本: favicon.ico 图标等: 而在 Spring Boot 中如果没有做任何配置,是无法直接访问静态资源的,通常会报 404 错误: 二.Spring Boot 访问静态资源的默认目录 Spring Boot 访问静态资源,默认有两个默认目录: classpath/static 目录:src/mian/resource Servle

  • Java多线程中ReentrantLock与Condition详解

    一.ReentrantLock类 1.1什么是reentrantlock java.util.concurrent.lock中的Lock框架是锁定的一个抽象,它允许把锁定的实现作为Java类,而不是作为语言的特性来实现.这就为Lock的多种实现留下了空间,各种实现可能有不同的调度算法.性能特性或者锁定语义.ReentrantLock类实现了Lock,它拥有与synchronized相同的并发性和内存语义,但是添加了类似锁投票.定时锁等候和可中断锁等候的一些特性.此外,它还提供了在激烈争用情况下更

  • Java多线程中线程的两种创建方式及比较代码示例

    1.线程的概念:线程(thread)是指一个任务从头至尾的执行流,线程提供一个运行任务的机制,对于java而言,一个程序中可以并发的执行多个线程,这些线程可以在多处理器系统上同时运行.当程序作为一个应用程序运行时,java解释器为main()方法启动一个线程. 2.并行与并发: (1)并发:在单处理器系统中,多个线程共享CPU时间,而操作系统负责调度及分配资源给它们. (2)并行:在多处理器系统中,多个处理器可以同时运行多个线程,这些线程在同一时间可以同时运行,而不同于并发,只能多个线程共享CP

  • 对python多线程中互斥锁Threading.Lock的简单应用详解

    一.线程共享进程资源 每个线程互相独立,相互之间没有任何关系,但是在同一个进程中的资源,线程是共享的,如果不进行资源的合理分配,对数据造成破坏,使得线程运行的结果不可预期.这种现象称为"线程不安全". 实例如下: #-*- coding: utf-8 -*- import threading import time def test_xc(): f = open("test.txt","a") f.write("test_dxc&quo

  • C++详解多线程中的线程同步与互斥量

    目录 线程同步 互斥量 线程同步 /* 使用多线程实现买票的案例. 有3个窗口,一共是100张票. */ #include <stdio.h> #include <pthread.h> #include <unistd.h> // 全局变量,所有的线程都共享这一份资源. int tickets = 100; void * sellticket(void * arg) { // 卖票 while(tickets > 0) { usleep(6000); //微秒 p

  • Python多线程中线程数量如何控制

    前言 前段时间学习了python的多线程爬虫,当时爬取一个图片网站,开启多线程后,并没有限制线程的数量,也就是说,如果下载1000张图片,会一次性开启1000个子线程同时进行下载 现在希望控制线程数量:例如每次只下载5张,当下载完成后再下载另外5张,直至全部完成 查了一些资料,发现在python中,threading 模块有提供 Semaphore类 和 BoundedSemaphore类来限制线程数 官网给出例子如下: 信号量通常用于保护容量有限的资源,例如数据库服务器.在资源大小固定的任何情

  • SpringMVC访问静态资源的方法

    在SpringMVC中常用的就是Controller与View.但是我们常常会需要访问静态资源,如html,js,css,image等. 默认的访问的URL都会被DispatcherServlet所拦截,但是我们希望静态资源可以直接访问.该肿么办呢? 在配置文件:web.xml可以看到: <!-- Processes application requests --> <servlet> <servlet-name>appServlet</servlet-name&

  • Java多线程中线程间的通信实例详解

    Java多线程中线程间的通信 一.使用while方式来实现线程之间的通信 package com.ietree.multithread.sync; import java.util.ArrayList; import java.util.List; public class MyList { private volatile static List list = new ArrayList(); public void add() { list.add("apple"); } publ

  • SpringMVC访问静态资源的三种方式小结

    如果你的DispatcherServlet拦截 *.do这样的URL,就不存在访问不到静态资源的问题.如果你的DispatcherServlet拦截"/",拦截了所有的请求,同时对*.js,*.jpg的访问也就被拦截了. 目的:可以正常访问静态文件,不要找不到静态文件报404. 方案一:激活Tomcat的defaultServlet来处理静态文件 <servlet-mapping> <servlet-name>default</servlet-name&g

随机推荐