zoukankan      html  css  js  c++  java
  • 多线程,lock使用

    using System;
    using System.Collections.Generic;
    using System.Text;
    using System.Security.Cryptography;
    using System.IO;
    using System.Linq;
    using System.Data.SqlClient;
    using System.Data;
    using System.Text.RegularExpressions;
    using System.Diagnostics;
    using System.Net.Mail;
    using System.Threading;
    using System.Collections;
    namespace CSharp
    {
        public class Program
        {
            static void Main()
            {
                SS s = new SS();
                SS s2 = new SS();
                s.Test("s");
                Thread.Sleep(100);
                s2.Test("s2");
                Console.ReadKey();
            }
        }

        public class SS
        {
            private int i = 0;
       //这个地方AL是静态的和非静态区别很大,如果是静态,则  s.Test("s")和   s2.Test("s2") 两个方法是对一个对象加锁,我们在  s.Test("s")后加上Thread.Sleep(100)可以保证s.Test("s")中的两个线程执行完毕以后才会执行   s2.Test("s2") 中的两个线程,若AL不是staitc,因为在s.AL和s2.AL不是同一个对象,所以  s.Test("s")和   s2.Test("s2") 两个方法中锁定的对象不一样,就不能保证s.Test("s")中的两个线程执行完毕以后才会执行   s2.Test("s2") 中的两个线程

            static ArrayList AL = new ArrayList(1);
            string name;
            public void Test(string str)
            {
                name = str;
                AL.Add(0);
                Thread t1 = new Thread(Thread1);
                Thread t2 = new Thread(Thread2);
                t1.Start();
                t2.Start();


            }

            void Thread1()
            {
                lock (AL)
                {
                    Console.WriteLine(name + ":执行Thread1开始");
                    Console.WriteLine(name + ":" + AL[0]);
                    Thread.Sleep(1000);
                    Console.WriteLine(name + ":" + AL[0]);
                    Console.WriteLine(name + ":执行Thread1结束");
                }
            }
            void Thread2()
            {
                lock (AL)
                {
                    Console.WriteLine(name + ":执行Thread2开始");
                    Thread.Sleep(250);
                    AL[0]=Convert.ToInt32(AL[0])+1;
                    Console.WriteLine(name + ":执行Thread2结束");
                }
            }
        }
    }
    摘抄别人博客的说法:
    lock语句根本使用的就是Moniter.Enter和Moniter.Exit,也就是说lock(this)时执行 Moniter.Enter(this),大括号结束时执行Monitor.Exit(this).他的意义在于什么呢,对于任何一个对象来说,他在内存 中的第一部分放置的是所有方法的地址,第二部分放着一个索引,他指向CLR中的SyncBlock Cache区域中的一个SyncBlock.什么意思呢?就是说,当你执行Monitor.Enter(Object)时,如果object的索引值为负 数,就从SyncBlock Cache中选区一个SyncBlock,将其地址放在object的索引中。这样就完成了以object为标志的锁定,其他的线程想再次进行 Monitor.Enter(object)操作,将获得object为正数的索引,然后就等待。直到索引变为负数,即线程使用 Monitor.Exit(object)将索引变为负数。
  • 相关阅读:
    java Activiti 工作流引擎 SSM 框架模块设计方案
    自定义表单 Flowable 工作流 Springboot vue.js 前后分离 跨域 有代码生成器
    数据库设计的十个最佳实践
    activiti 汉化 stencilset.json 文件内容
    JAVA oa 办公系统模块 设计方案
    java 考试系统 在线学习 视频直播 人脸识别 springboot框架 前后分离 PC和手机端
    集成 nacos注册中心配置使用
    “感恩节 ”怼记
    仓颉编程语言的一点期望
    关于System.out.println()与System.out.print("\n")的区别
  • 原文地址:https://www.cnblogs.com/mxw09/p/1878227.html
Copyright © 2011-2022 走看看