稳扎稳打Silverlight(26) - 2.0线程之Lock, Interlocked, EventWaitHandle, Monitor

简介:
[索引页]
[源码下载]


稳扎稳打Silverlight(26) - 2.0线程之Lock, Interlocked, EventWaitHandle, Monitor, ThreadStaticAttribute


作者: webabcd


介绍
Silverlight 2.0 使用Lock, Interlocked, EventWaitHandle, Monitor来实现线程同步
    Lock - 确保代码块完成运行,而不会被其他线程中断
    Interlocked - 为多个线程共享的变量提供原子级的操作
    EventWaitHandle - 通知其他线程是否可入的类
    Monitor - 提供同步访问对象的机制
    ThreadStaticAttribute - 所指定的静态变量对每个线程都是唯一的


在线DEMO
http://webabcd.blog.51cto.com/1787395/342779


示例
1、Lock.xaml
<UserControl x:Class="Silverlight20.Thread.Lock" 
        xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"    
        xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"> 
        <StackPanel HorizontalAlignment="Left" Margin="5"> 

                <TextBlock x:Name="txtMsg" /> 

        </StackPanel> 
</UserControl>
 
Lock.xaml.cs
using System; 
using System.Collections.Generic; 
using System.Linq; 
using System.Net; 
using System.Windows; 
using System.Windows.Controls; 
using System.Windows.Documents; 
using System.Windows.Input; 
using System.Windows.Media; 
using System.Windows.Media.Animation; 
using System.Windows.Shapes; 
 
namespace Silverlight20.Thread 

         public partial  class Lock : UserControl 
        { 
                 // 需要被 lock 的静态变量 
                 private  static  readonly  object objLock =  new  object(); 
 
                 private  static  int i; 
 
                 public Lock() 
                { 
                        InitializeComponent(); 
 
                        i = 0; 
 
                         for ( int x = 0; x < 100; x++) 
                        { 
                                 // 开 100 个线程去操作静态变量 i 
                                System.Threading.Thread thread =  new System.Threading.Thread( new System.Threading.ThreadStart(DoWork)); 
                                thread.Start(); 
                        } 
 
                        System.Threading.Thread.Sleep(3000); 
                         // 3 秒后 100 个线程都应该执行完毕了,取得 i 的结果 
                         // 做了并发处理的结果为 100 ,去掉 lock 可得到不做并发处理的结果 
                        txtMsg.Text = i.ToString(); 
                } 
 
                 private  void DoWork() 
                { 
                         try 
                        { 
                                 // lock() - 确保代码块完成运行,而不会被其他线程中断。其参数必须为一个引用类型的对象 
                                 lock (objLock) 
                                { 
                                         int j = i + 1; 
 
                                         // 模拟多线程并发操作静态变量 i 的情况 
                                        System.Threading.Thread.Sleep(10); 
 
                                        i = j; 
                                } 
                        } 
                         finally 
                        { 
                                 // code 
                        } 
                } 
        } 
}
 
 
2、Interlocked.xaml
<UserControl x:Class="Silverlight20.Thread.Interlocked" 
        xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"    
        xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"> 
        <StackPanel HorizontalAlignment="Left" Margin="5"> 

                <TextBlock x:Name="txtMsg" /> 

        </StackPanel> 
</UserControl>
 
Interlocked.xaml.cs
using System; 
using System.Collections.Generic; 
using System.Linq; 
using System.Net; 
using System.Windows; 
using System.Windows.Controls; 
using System.Windows.Documents; 
using System.Windows.Input; 
using System.Windows.Media; 
using System.Windows.Media.Animation; 
using System.Windows.Shapes; 
 
namespace Silverlight20.Thread 

         public partial  class Interlocked : UserControl 
        { 
                 private  static  int i; 
 
                 public Interlocked() 
                { 
                        InitializeComponent(); 
 
                        i = 0; 
 
                         for ( int x = 0; x < 100; x++) 
                        { 
                                 // 开 100 个线程去操作静态变量 i 
                                System.Threading.Thread thread =  new System.Threading.Thread( new System.Threading.ThreadStart(DoWork)); 
                                thread.Start(); 
                        } 
 
                        System.Threading.Thread.Sleep(1000); 
                         // 1 秒后 100 个线程都应该执行完毕了,取得 i 的结果 
                        txtMsg.Text = i.ToString(); 
                } 
 
                 private  void DoWork() 
                { 
                         try 
                        { 
                                 // Interlocked - 为多个线程共享的变量提供原子级的操作(避免并发问题) 
 
                                 // i 加 1 
                                System.Threading.Interlocked.Increment( ref i); 
 
                                 // i 减 1 
                                System.Threading.Interlocked.Decrement( ref i); 
 
                                 // i 加 1 
                                System.Threading.Interlocked.Add( ref i, 1); 
 
                                 // 如果 i 等于 100 ,则将 i 赋值为 101 
                                System.Threading.Interlocked.CompareExchange( ref i, 101, 100);    
 
                                 // 将 i 赋值为 1000 
                                 // System.Threading.Interlocked.Exchange(ref i, 1000); 
                        } 
                         finally 
                        { 
                                 // code 
                        } 
                } 
        } 
}
 
 
 
 



     本文转自webabcd 51CTO博客,原文链接: http://blog.51cto.com/webabcd/343912 ,如需转载请自行联系原作者
 
相关文章
|
3月前
|
Java 开发者 C++
Java多线程同步大揭秘:synchronized与Lock的终极对决!
Java多线程同步大揭秘:synchronized与Lock的终极对决!
80 5
|
17天前
|
Java 开发者
在Java多线程编程的世界里,Lock接口正逐渐成为高手们的首选,取代了传统的synchronized关键字
在Java多线程编程的世界里,Lock接口正逐渐成为高手们的首选,取代了传统的synchronized关键字
44 4
|
1月前
|
Java 开发者
在 Java 多线程编程中,Lock 接口正逐渐取代传统的 `synchronized` 关键字,成为高手们的首选
【10月更文挑战第6天】在 Java 多线程编程中,Lock 接口正逐渐取代传统的 `synchronized` 关键字,成为高手们的首选。相比 `synchronized`,Lock 提供了更灵活强大的线程同步机制,包括可中断等待、超时等待、重入锁及读写锁等高级特性,极大提升了多线程应用的性能和可靠性。通过示例对比,可以看出 Lock 接口通过 `lock()` 和 `unlock()` 明确管理锁的获取和释放,避免死锁风险,并支持公平锁选择和条件变量,使其在高并发场景下更具优势。掌握 Lock 接口将助力开发者构建更高效、可靠的多线程应用。
25 2
|
2月前
|
Java
领略Lock接口的风采,通过实战演练,让你迅速掌握这门高深武艺,成为Java多线程领域的武林盟主
领略Lock接口的风采,通过实战演练,让你迅速掌握这门高深武艺,成为Java多线程领域的武林盟主
37 7
|
3月前
|
安全 Java 开发者
Java多线程同步:synchronized与Lock的“爱恨情仇”!
Java多线程同步:synchronized与Lock的“爱恨情仇”!
86 5
|
3月前
|
Java 开发者
揭秘!为什么大神都爱用Lock接口处理线程同步?
揭秘!为什么大神都爱用Lock接口处理线程同步?
77 5
|
3月前
|
Java
在Java多线程领域,精通Lock接口是成为高手的关键。
在Java多线程领域,精通Lock接口是成为高手的关键。相较于传统的`synchronized`,Lock接口自Java 5.0起提供了更灵活的线程同步机制,包括可中断等待、超时等待及公平锁选择等高级功能。本文通过实战演练介绍Lock接口的核心实现——ReentrantLock,并演示如何使用Condition进行精确线程控制,帮助你掌握这一武林秘籍,成为Java多线程领域的盟主。示例代码展示了ReentrantLock的基本用法及Condition在生产者-消费者模式中的应用,助你提升程序效率和稳定性。
41 2
|
3月前
|
Java 开发者
在 Java 多线程编程中,Lock 接口正逐渐取代传统的 `synchronized` 关键字,成为高手们的首选
在 Java 多线程编程中,Lock 接口正逐渐取代传统的 `synchronized` 关键字,成为高手们的首选。相比 `synchronized`,Lock 提供了更灵活强大的线程同步机制,包括可中断等待、超时等待、重入锁及读写锁等高级特性,极大提升了多线程应用的性能和可靠性。通过示例对比,可以看出 Lock 接口通过 `lock()` 和 `unlock()` 明确管理锁的获取和释放,避免死锁风险,并支持公平锁选择和条件变量,使其在高并发场景下更具优势。掌握 Lock 接口将助力开发者构建更高效、可靠的多线程应用。
28 2
|
3月前
|
Java
多线程同步新姿势:Lock接口助你“一统江湖”!
多线程同步新姿势:Lock接口助你“一统江湖”!
49 2
|
3月前
|
Java 测试技术
Java多线程同步实战:从synchronized到Lock的进化之路!
Java多线程同步实战:从synchronized到Lock的进化之路!
101 1
下一篇
无影云桌面