• Java进击C#——语法之线程同步


    lock方式

    对lock的关键字作用跟JAVA的synchronized关键字类似。但有一定的差别。JAVA的synchronized关键字可能修饰在方法上面。可惜C#却不能修饰在方法上面。用法有什么不同吗。那不如让我们看一下代码?

    C#:

    复制代码
    lock (aomiLock)
    {
        Thread.Sleep(300000);
         i++;
    
         Console.WriteLine(aomiLock.Name);
    }
    复制代码

    上面的aomiLock只是一个笔者定义类的一个实例而以。显然笔者是看不出写法上有多大的的区别。对于lock的用法,有一个新人这样子问我:如果我有俩个静态的全局变量。一个用去作lock的参数值。即是上面的aomiLock变理的位置。另一个在lock内部。即是大括号里面。那么可以在别的地方修改lock内部的值呢?我只能跟他说声对不起。可以修改的。

    注意:上面有说到volatile关键字事实在JAVA也有volatile关键字。都是作用于变量级别的。作用只是让变理可见。这一点跟JAVA是一样子。同时如果你想用跟synchronized关键字一样子修饰在方法上面的话。不好意思请用[MethodImpl(MethodImplOptions.Synchronized)]。

    Monitor类

    Monitor类在使用上跟locak的关键字有一点像。只是Monitor类本身提供了太多灵活的功能。大家是否知道JAVA 5.0之后提供的一个叫Lock接口。他的实例类ReentrantLock。他的功能就跟Monitor类类似。

    复制代码
    bool acquireLock = false;
    Monitor.Enter(aomiLock, ref acquireLock);
              
    //内容
    i++;
    Console.WriteLine("add i=" + i);
             
    Monitor.Exit(aomiLock);
    复制代码
    Mutex类

    这是一个互斥锁,笔者很少用他来作同步。Mutex类的作用可以到进程之间。所以更多的是被用在一个电脑只能运行一个应用程序的功能上。而且他用的资源比较大。但笔者没有办法证明。总之笔者很少用他就对了。

    复制代码
     1  class Program
     2     {
     3         public static Mutex mutex;
     4         static void Main(string[] args)
     5         {
     6             bool created;
     7             mutex = new Mutex(false, "aomiApplication", out created);
     8 
     9             Console.ReadKey();
    10 
    11         }
    12 
    13         public static void Add()
    14         {
    15             for (int i = 0; i < 10; i++)
    16             {
    17                 mutex.WaitOne();
    18                 Console.WriteLine("add i=" + i);
    19                 mutex.ReleaseMutex();
    20 
    21             }
    22 
    23         }
    24     }
    复制代码

    Mutex类的构造函数第一个参数用于表示。是否在新建Mutex类的时候就获得互斥权利。true表示立即获得。false的话则用WaitOne方法来获得。相信笔者不用多说大家也明白。

     SemaphoreSlim类

    SemaphoreSlim类笔者觉得他是一个控制线程量的一个类。他常常用于控制在当前应用最多能运行几个线程或异步运行的数量。笔者更多的用于设计公司的框架的时候应用。

    复制代码
    class Program
        {
            public static SemaphoreSlim ss = new SemaphoreSlim(4);
            static void Main(string[] args)
            {
    
                for (int i = 0; i < 10; i++)
                {
                    Thread thread = new Thread(Add);
                    thread.Start();
                }
    
                Console.ReadKey();
    
            }
    
            public static void Add()
            {
                if (ss.Wait(2000))
                {
                    Console.WriteLine("正在运行中");
                    Thread.Sleep(2000);
                    ss.Release();
                }
                else
                {
                    Console.WriteLine("线程忙");
                }
            
            }
        }
    复制代码
    AutoResetEvent类

    笔者个人认为这个类不属于同步类里面的。更觉得他是一个信号灯的一个概念。可是他却也能实现小功能的同步工作。在设计框架的时候笔者也常常用到。

    复制代码
    class Program
        {
            public static AutoResetEvent mainEvent = new AutoResetEvent(false);
            static void Main(string[] args)
            {
                Thread thread = new Thread(Execute);
                thread.Start();
    
                mainEvent.Set();//通知他可以很执行了
                Console.ReadKey();
    
    
            }
    
            public static void Execute()
            {
                mainEvent.WaitOne();
                Console.WriteLine("Execute 正在运行中");
                //内容
    
            }
        }
    复制代码
    本章总结

    本章主要介绍关于线程之间同步数据的一些常用的方式。当然以上只是笔者常用到的而以。并不全面。好了本章就到这里了。

  • 相关阅读:
    ubuntu环境下eclipse的安装以及hadoop插件的配置
    hadoop启动步骤
    Ubuntu下hadoop环境的搭建(伪分布模式)
    volatile关键字作用
    CyclicBarrier&CountDownLatch&Semaphore
    Callable、Future和FutureTask浅析
    Unsafe与CAS
    接口和抽象类的区别
    内部类
    泛型
  • 原文地址:https://www.cnblogs.com/chenliyang/p/6552486.html
Copyright © 2020-2023  润新知