惯性聚合 高效追踪和阅读你感兴趣的博客、新闻、科技资讯
阅读原文 在惯性聚合中打开

推荐订阅源

T
Tor Project blog
博客园 - 聂微东
Microsoft Azure Blog
Microsoft Azure Blog
博客园 - 【当耐特】
G
Google Developers Blog
J
Java Code Geeks
The Cloudflare Blog
Attack and Defense Labs
Attack and Defense Labs
宝玉的分享
宝玉的分享
Last Week in AI
Last Week in AI
Cisco Talos Blog
Cisco Talos Blog
酷 壳 – CoolShell
酷 壳 – CoolShell
I
Intezer
Jina AI
Jina AI
T
Tenable Blog
P
Palo Alto Networks Blog
Project Zero
Project Zero
D
DataBreaches.Net
Hugging Face - Blog
Hugging Face - Blog
The Hacker News
The Hacker News
F
Full Disclosure
Cloudbric
Cloudbric
量子位
H
Heimdal Security Blog
K
Kaspersky official blog
有赞技术团队
有赞技术团队
罗磊的独立博客
V
Vulnerabilities – Threatpost
cs.AI updates on arXiv.org
cs.AI updates on arXiv.org
阮一峰的网络日志
阮一峰的网络日志
Vercel News
Vercel News
Recent Announcements
Recent Announcements
WordPress大学
WordPress大学
GbyAI
GbyAI
S
SegmentFault 最新的问题
M
MIT News - Artificial intelligence
OSCHINA 社区最新新闻
OSCHINA 社区最新新闻
I
InfoQ
Recorded Future
Recorded Future
Security Archives - TechRepublic
Security Archives - TechRepublic
AI
AI
Webroot Blog
Webroot Blog
C
CXSECURITY Database RSS Feed - CXSecurity.com
爱范儿
爱范儿
freeCodeCamp Programming Tutorials: Python, JavaScript, Git & More
T
The Exploit Database - CXSecurity.com
Apple Machine Learning Research
Apple Machine Learning Research
C
Cybersecurity and Infrastructure Security Agency CISA
H
Hacker News: Front Page
Latest news
Latest news

博客园 - 言午

Nopcommerce 二次开发2 Admin Nopcommerce 二次开发1 基础 Nopcommerce 二次开发2 WEB Nopcommerce 二次开发0 sqlce中不支持sp_rename修改表名 C#读取Excel遇到无法读取的解决方法 狼奔代码生成器 银行账户类 累 interface 抽象类 抽象方法 Message 类的继承 多态(虚方法) 事件event 委托 代理 索引! 第五周作业 第四周作业 考试! 线程安全 二
线程安全 一
言午 · 2011-11-15 · via 博客园 - 言午

using System;
using System.Threading;
using System.Runtime.Remoting.Contexts;
using System.Runtime.CompilerServices;

// Note that the instance variable count is shared between the two methods Read
// and Increment. Threads concurrently executing one or both of these methods can
// interfere with each other unless action is taken to synchronize access

class CounterUnsafe
{
    int count = 0;

    public void Increment() 
    {
        // following code is not thread-safe and has a race condition
        Console.WriteLine(
            "Start Resource writing count: {0}", count);
        // the following four lines simulate count++ with a very large
        
// window of time between count being read and being incremented.
        
// This large window ensures that the race condition will create
        
// errors often when the code is accessed concurrently by multiple threads.
        int tempCount = count;
        Thread.Sleep(50);
        tempCount++;
        count = tempCount;
        Console.WriteLine(
            "Stop  Resource writing count: {0}",  count);
    }
}

// Context-bound type with the Synchronization context attribute.
[Synchronization()]
class CounterSynchronizedContext : ContextBoundObject
{
    static int staticCount = 0;
    int instanceCount = 0;

    public void IncrementInstance() 
    {
        Console.WriteLine(
            "Start Object:{0} Thread:{1}  Resource writing count, instance:{2}"
            this.GetHashCode(), Thread.CurrentThread.GetHashCode(),
            instanceCount);
        int tempStaticCount = staticCount;
        int tempInstanceCount = instanceCount;
        Thread.Sleep(50);
        tempInstanceCount++;
        instanceCount = tempInstanceCount;
        Console.WriteLine(
            "Stop Object:{0} Thread:{1}  Resource writing count, instance:{2}"
            this.GetHashCode(), Thread.CurrentThread.GetHashCode(),
            instanceCount);
    }    
    
     public static void IncrementStatic() 
        {
            Console.WriteLine(
                "Start Thread:{0}  Resource writing count, static:{1}"
                Thread.CurrentThread.GetHashCode(),
                staticCount);
            int tempStaticCount = staticCount;
            Thread.Sleep(50);
            tempStaticCount++;
            staticCount = tempStaticCount;
            Console.WriteLine(
                "Stop Thread:{0}  Resource writing count, static:{1}"
                Thread.CurrentThread.GetHashCode(),
                staticCount);
        }
}
class CounterSynchronizedCodeRegion
{
    static int staticCount = 0;
    int instanceCount = 0;

    [MethodImplAttribute(MethodImplOptions.Synchronized)]
    public void IncrementInstance() 
    {
        Console.WriteLine(
            "Start Object:{0} Thread:{1}  Resource writing count, instance:{2}"
            this.GetHashCode(), Thread.CurrentThread.GetHashCode(),
            instanceCount);
        int tempInstanceCount = instanceCount;
        Thread.Sleep(50);
        tempInstanceCount++;
        instanceCount = tempInstanceCount;
        Console.WriteLine(
            "Stop Object:{0} Thread:{1}  Resource writing count, instance:{2}"
            this.GetHashCode(), Thread.CurrentThread.GetHashCode(),
            instanceCount);
    }

    [MethodImplAttribute(MethodImplOptions.Synchronized)]
     public static void IncrementStatic() 
    {
        Console.WriteLine(
        "Start Thread:{0}  Resource writing count, static:{1}"
            Thread.CurrentThread.GetHashCode(),
            staticCount);
        int tempStaticCount = staticCount;
        Thread.Sleep(50);
        tempStaticCount++;
        staticCount = tempStaticCount;
        Console.WriteLine(
            "Stop Thread:{0}  Resource writing count, static:{1}"
            Thread.CurrentThread.GetHashCode(),
            staticCount);
    }
}

class App 
{
    public static void Main() 
    {
        Thread t1, t2, t3;
        Console.WriteLine("\n\nStarting Unsafe Test");
        CounterUnsafe counterUnsafe = new CounterUnsafe();
        t1 = new 
            Thread(    new 
                ThreadStart(counterUnsafe.Increment)); 
        t1.Start();
        t2 = new 
            Thread(    new 
                ThreadStart(counterUnsafe.Increment)); 
        t2.Start();
        t3 = new 
            Thread(    new 
                ThreadStart(counterUnsafe.Increment)); 
        t3.Start();
        // wait for all threads to indicate that they are done.
        t1.Join();t2.Join();t3.Join();
        Console.WriteLine("All Unsafe threads have completed.");
        
        // Synchronized context doesn't prevent static methods from concurrently executing
        Console.WriteLine("\n\nStarting Static Method Synchronized Context Test");
        t1 = new 
            Thread(    new 
            ThreadStart(CounterSynchronizedContext.IncrementStatic)); 
        t1.Start();
        t2 = new 
            Thread(    new 
            ThreadStart(CounterSynchronizedContext.IncrementStatic)); 
        t2.Start();
        t3 = new 
            Thread(    new 
            ThreadStart(CounterSynchronizedContext.IncrementStatic)); 
        t3.Start();

        // wait for all threads to indicate that they are done.
        t1.Join();t2.Join();t3.Join();
        Console.WriteLine("All Static Method Synchronized Context threads have completed.");
        
        // Synchronized context does prevent instance methods from concurrently executing
        Console.WriteLine("\n\nStarting Instance Method Synchronized Context Test");
        CounterSynchronizedContext counterSynchronizedContext = new CounterSynchronizedContext();
        t1 = new 
            Thread(    new 
            ThreadStart(counterSynchronizedContext.IncrementInstance)); 
        t1.Start();
        t2 = new 
            Thread(    new 
            ThreadStart(counterSynchronizedContext.IncrementInstance)); 
        t2.Start();
        t3 = new 
            Thread(    new 
            ThreadStart(counterSynchronizedContext.IncrementInstance)); 
        t3.Start();

        // wait for all threads to indicate that they are done.
        t1.Join();t2.Join();t3.Join();
        Console.WriteLine("All Instance Method Synchronized Context threads have completed.");
        
        Console.WriteLine("\n\nStarting Static Method Synchronized Code Region Test");
        t1 = new 
            Thread(    new 
            ThreadStart(CounterSynchronizedCodeRegion.IncrementStatic)); 
        t1.Start();
        t2 = new 
            Thread(    new 
            ThreadStart(CounterSynchronizedCodeRegion.IncrementStatic)); 
        t2.Start();
        t3 = new 
            Thread(    new 
            ThreadStart(CounterSynchronizedCodeRegion.IncrementStatic)); 
        t3.Start();
        // wait for all threads to indicate that they are done.
        t1.Join();t2.Join();t3.Join();

        Console.WriteLine("All Static Method Synchronized Code Region threads have completed.");
        
        // Method Synchronization is similar to Monitor and prevents 
        
// concurrent access to both static and instance methods
        Console.WriteLine("\n\nStarting Instance Method Synchronized Code Region Test");
        CounterSynchronizedCodeRegion counterSynchronizedCodeRegion = new CounterSynchronizedCodeRegion();
        t1 = new 
            Thread(    new 
            ThreadStart(counterSynchronizedCodeRegion.IncrementInstance)); 
        t1.Start();
        t2 = new 
            Thread(    new 
            ThreadStart(counterSynchronizedCodeRegion.IncrementInstance)); 
        t2.Start();
        t3 = new 
            Thread(    new 
            ThreadStart(counterSynchronizedCodeRegion.IncrementInstance)); 
        t3.Start();

        // wait for all threads to indicate that they are done.
        t1.Join();t2.Join();t3.Join();
        Console.WriteLine("All Static Method Synchronized Code Region threads have completed.");

    }

}