线程同步

线程同步方式详解
本文介绍了两种常用的线程同步方式:锁(Lock)和读写锁(ReaderWriterLock)。锁适用于多线程对同一资源的互斥访问,而读写锁允许多个线程同时进行读操作,仅写操作时采用互斥。文章通过示例代码展示了这两种同步机制的具体实现。

线程同步的方式有多种,这里只写两种可能常用的。

线程锁主要用于多线程对同一资源进行访问时产生的问题。

1.lock 很简单。

2.montor 获取资源使用monitor.Enter(),释放资源 Monitor.Exit();两者合起来相当于lock。

3、以上两种当多线程对统一资源进行访问时同时只能有一个线程访问,会造成其他线程阻塞的情况,例如多个线程同时读取一个资源时就会产生这种情况,线程阻塞又浪费资源,不是必要的,希望多线程能够同时读取同一的资源,可以使用另一种线程同步的方式:ReaderWriterLock   

使用方:写入时使用 ReaderWriterLock的AcquireWriterLock(int time)方法  time为超时时间 释放写入锁为 ReleaseWriterLock() 方法。

读取时使用: ReaderWriterLock的AcquireReaderLock(int time) 方法 其中time为超时时间 毫秒  释放读取锁为:ReleaseReaderLock()方法。

总结:其他还有线程同步的方式,我不常用不在这里写了 ,线程同步是一项十分耗费资源和性能的工作,对性能的伤害比较大,本机测试大致使用线程同步耗费的时间是不使用线程同步耗费时间的8倍左右。所以线程同步一定要慎用,如果程序中必须使用线程同步的话枷锁的代码越少越好,尽量使枷锁的时间缩短。

 

举例说明:

monitor的方式:

using System;
using System.Threading;

namespace MonitorSample
{
    class Program
    {
        static void Main(string[] args)
        {
            for (int i = 0; i < 10; i++)
            {
                Thread test = new Thread(Add);
                test.Start();
            }

            Console.Read();
        }

        // 共享资源
        public static int number = 0;

        public static void Add()
        {
            Thread.Sleep(1000);
            //获得排他锁
            Monitor.Enter(number);

            Console.WriteLine("the current value of number is:{0}", number++);

            // 释放指定对象上的排他锁。
            Monitor.Exit(number);
        }
    }
}

ReaderWriterLock的方式:

using System;
using System.Collections.Generic;
using System.Threading;

namespace ReaderWriterLockSample
{
    class Program
    {
        public static List<int> lists = new List<int>();

        // 创建一个对象
        public static ReaderWriterLock readerwritelock = new ReaderWriterLock();
        static void Main(string[] args)
        {
            //创建一个线程读取数据
            Thread t1 = new Thread(Write);
            t1.Start();
            // 创建10个线程读取数据
            for (int i = 0; i < 10; i++)
            {
                Thread t = new Thread(Read);
                t.Start();
            }

            Console.Read();
                
        }

        // 写入方法
        public static void Write()
        {
            // 获取写入锁,以10毫秒为超时。
            readerwritelock.AcquireWriterLock(10);
            Random ran = new Random();
            int count = ran.Next(1, 10);
            lists.Add(count);
            Console.WriteLine("Write the data is:" + count);
            // 释放写入锁
            readerwritelock.ReleaseWriterLock();
        }

        // 读取方法
        public static void Read()
        {
            // 获取读取锁
            readerwritelock.AcquireReaderLock(10);
            //Lam表达式展示
           lists.ForEach(r=>{Console.WriteLine(r.ToSting());});
            
            // 释放读取锁
            readerwritelock.ReleaseReaderLock();
        }
    }
}           

  

转载于:https://www.cnblogs.com/dghwey/p/5019877.html

标题基于Python的自主学习系统后端设计与实现AI更换标题第1章引言介绍自主学习系统的研究背景、意义、现状以及本文的研究方法和创新点。1.1研究背景与意义阐述自主学习系统在教育技术领域的重要性和应用价值。1.2国内外研究现状分析国内外在自主学习系统后端技术方面的研究进展。1.3研究方法与创新点概述本文采用Python技术栈的设计方法和系统创新点。第2章相关理论与技术总结自主学习系统后端开发的相关理论和技术基础。2.1自主学习系统理论阐述自主学习系统的定义、特征和理论基础。2.2Python后端技术栈介绍DjangoFlask等Python后端框架及其适用场景。2.3数据库技术讨论关系型和非关系型数据库在系统中的应用方案。第3章系统设计与实现详细介绍自主学习系统后端的设计方案和实现过程。3.1系统架构设计提出基于微服务的系统架构设计方案。3.2核心模块设计详细说明用户管理、学习资源管理、进度跟踪等核心模块设计。3.3关键技术实现阐述个性化推荐算法、学习行为分析等关键技术的实现。第4章系统测试与评估对系统进行功能测试和性能评估。4.1测试环境与方法介绍测试环境配置和采用的测试方法。4.2功能测试结果展示各功能模块的测试结果和问题修复情况。4.3性能评估分析分析系统在高并发等场景下的性能表现。第5章结论与展望总结研究成果并提出未来改进方向。5.1研究结论概括系统设计的主要成果和技术创新。5.2未来展望指出系统局限性并提出后续优化方向。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值