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; } } }
以上是小编为您精心准备的的内容,在的博客、问答、公众号、人物、课程等栏目也有的相关内容,欢迎继续使用右上角搜索按钮进行搜索问题
, 对象
, 线程
, 多线程
, 类型
, 一个
, c#案例
哲学家就餐问题
c站、c语言、cf、ch、c罗,以便于您获取更多的相关知识。