C#编程总结(五)关于多线的思考 - oop.com.cn_面向对象设计网站 - 面向对象技术开发

面向对象技术开发

会员投稿 投稿指南 站长资讯通告:
您的位置: 首页 > OOP语言 > C# > 正文

C#编程总结(五)关于多线的思考

来源: www.bianceng.cn 阅读:

1、什么时候使用多线程?

这个问题,对于系统架构师、设计者、程序员,都是首先要面对的一个问题。

在什么时候使用多线程技术?

在许多常见的情况下,可以使用多线程处理来显著提高应用程序的响应能力和可用性。

上一章,我们讲了几个多线程的应用案例,主要的应用场景也做了介绍。这里不再赘述。

http://www.cnblogs.com/yank/p/3232955.html

2、如何才能保证线程安全?

使用多线程,这是一个必须要弄清的问题。只有了解了多线程对结构和程序的影响,才能真正会使用 多线程,使其发挥应有的效果。

为什么应用多线程就不安全了呢?

线程安全的一个判定指标,线程之间有没有临界资源,如果有临界资源,且没有采用合理的同步机制 ,就会出现多个线程竞争一个资源,如若多个线程都在为得不到所需的资源,则会发生死锁。死锁,线 程就会彼此僵持,系统停滞不前,如果后果严重,则直接导致系统崩溃。常见的案例有:生产者与消费 者问题、哲学家就餐问题等。

咱就根据哲学家就餐问题做个简化:两个人去餐馆吃饭,由于资源紧张,只有一双筷子,每个人都饿 了,都想吃饭,且同时去抢筷子,势均力敌,两人每人抢到一根筷子,只有使用一双筷子才能吃饭。这 时你会说了,我可以用手抓着吃,呵呵。如果是刚出锅的饺子,怕你抓不起来。两个人只能面面相觑, 大眼瞪小眼,就是吃不上。如果如果僵持个一年半载,都饿死了。哈哈。如果我们给一个约定,在拿筷 子时,一下拿到一双,且吃完就交换给对方。则两个人都高高兴兴吃上饭了。筷子就是临界资源。当然 ,在两个人僵持的时候,可以进行外部干预,使得两个人都有饭吃。比如:强制一方将筷子空闲出来, 则另一方就饭吃了。吃完了筷子空闲出来,则另一个人也有饭吃了。

只要我们处理好临界资源问题,也就解决了线程安全问题。

使用多线程,未必必须要做好线程同步,但是如果有临界资源,则必须进行线程同步处理。

3、 如何能写出线程安全的代码?

在OOP中,程序员使用的无非是:变量、对象(属性、方法)、类型等等。

1)变量

变量包括值类型和引用类型。

值类型是线程安全的,但是如果作为对象的属性,值类型就被附加到对象上,需要参考对象的线程安 全性。

引用类型,这里要注意的是,对于引用对象,他包括了引用和对象实例两部分,实例需要通过对其存 储位置的引用来访问,对于

private Object o = new Object(),

其实可以分解为两句话:

private Object o;

o = new Object();

其中private Object o是定义了对象的引用,也就是记录对象实例的指针,而不是对象本身。这个引 用存储于堆栈中,占用4个字节;当没有使用o = new Object()时,引用本身的值为null,也就是不指向 任何有效位置;当o = new Object()后,才真正根据对象的大小,在托管堆中分配空间给对象实例,然 后将实例的指针位置赋值给前面的引用。这才完成一个对象的实例化。

引用类型的安全性,在于:可以由多个引用,同时指向一个内存地址。如果一个引用被修改,另一个 也会修改。

using System;
    
namespace VariableSample
{
    class Program
    {
        static void Main(string[] args)
        {
            Box b1 = new Box();
            b1.Name = "BigBox";
    
            Console.WriteLine("Create Box b1.");
            Console.WriteLine("Box: b1'Name is {0}.", b1.Name);
            Console.WriteLine("Create same Box b2.");
    
    
    
            Box b2 = b1;
            b2.Name = "LittleBox";
    
            Console.WriteLine("Box: b2's Name is {0}.",b2.Name);
            Console.WriteLine("Box: b1's Name is {0}.", b1.Name);
    
            Console.ReadKey();
        }
    }
    
    /// <summary>
    /// 盒子
    /// </summary>
    public class Box
    {
        /// <summary>
        /// 名称
        /// </summary>
        public string Name
        {
            get;
            set;
        }
    }
    
}

Tags:
相关文章列表: