线程同步与线程池

线程的优先级

五个优先级,由高到低分别是:Highest、AboveNormal、�Normal(默认)、BelowNormal和Lowest
可以使用下面的方法为其赋予较高的优先级:
Thread t = new Thread(MethodName);
t.priority = ThreadPriority.AboveNormal;
通过设置线程的优先级可以改变线程的执行顺序,所设置的优先级仅仅适用于这些线程所属的进程。
注意:
当把某线程的优先级设置为Highest时,系统正在运行的其他线程都会终止,所以使用这个优先级别时要特别小心。

线程同步

指多个线程之间存在先后执行顺序的关联关系。

哪些资源需要同步

  • 系统资源(如通信端口)
  • 多个进程所共享的资源(如文件句柄)
  • 由多个线程访问的单个应用程序域的资源(如全局、静态和实例字段)

为什么要同步

当两个线程t1和t2有相同的优先级,并且同时在系统上运行时,如果先把时间片分给t1使用,它在结构s1中(该结构中有多个变量)写入某些值,但如果在时间片用完时它仍没有完成写入,这时由于时间片已经分给t2使用,而t2又恰好要尝试读取该结构的值,此时读出的就不是正确的值。这种情况下,如果使用同步仅允许一个线程使用s1,在该线程完成对s1的写入工作后再让t2读取这个结构值,就可以避免出现此类错误。

解决方法:
System.Threading命名空间提供了多个用于同步线程的类这些类包括Mutex、Monitor、Interlocked和AutoResetEvent。
在实际应用中经常使用lock语句完成线程同步。
该语句简化了编程的复杂性,使程序看起来既清晰又简洁

lock语句

lock语句的功能

lock语句可以有效地实现同步,即将代码段(语句块)标记为临界区。它能确保当一个线程位于代码的临界区(可以理解为一段代码)时,另一个线程不进入临界区。如果其他线程试图进入锁定的代码段,则它将一直等待(即被阻塞),直到锁定的对象被释放以后才能进入临界区。

lock语句的用法

首先利用lock语句锁定某一个对象,然后执行代码段中的语句,等代码段中的语句执行完毕后,再释放该对象。
private Object obj = new Object();
……
lock(obj)
{
//临界区中的代码
}

使用lock语句应注意的问题

  • 锁定的对象名(上面代码中的obj)一般声明为Object类型,不要将其声明为值类型。
  • 锁定的对象名不能将其声明为public,只能为private
  • 临界区中的代码一般不宜太多。

多线程随机取款

//将lock (lockedObj)这句注释掉,看看会发生什么情况
            lock (lockedObj)
            {
                if (balance >= amount)
                {
                    string str = Thread.CurrentThread.Name + "取款---";
                    str+= string.Format("取款前余额:{0,-6}取款:{1,-6}", balance, amount);
                    balance = balance - amount;
                    str += "取款后余额:" + balance;
                    form1.AddListBoxItem(str);
                    return amount;
                }
                else
                {
                    return 0;
                }
            }

你可能感兴趣的:(线程同步与线程池)