c# - 什么是条件同步?

标签 c# synchronization conditional-statements

谁能给我解释一下条件同步?

一个示例(最好是在 C# 中)也将不胜感激。

最佳答案

听起来您的教授正在谈论线程。线程使计算机程序一次可以做不止一件事。在一个线程已经在运行时启动一个新线程的行为被计算机程序员称为“启动一个线程”。

线程可以共享同一个内存空间。条件同步(或简称同步)是一种保护内存区域不被两个不同线程同时修改的机制。

假设您外出购物,而妻子在家付账。这是一个天真的例子,在现实生活中并不是这样工作的,但它可以作为一个简单的例子。

您的妻子正在网上支付账单。同时,您正在杂货店刷信用卡。这两种行为都涉及将钱从您的支票账户中转出。为了模拟这个事件,我们编写了以下代码:

public class MyBanking
{
    static double myAccountBalance;
    //
    public void DebitAccount(double debitAmount)
    {
        Console.Writeline("Your Old Balance is: " + myAccountBalance.ToString());
        Console.Writeline("Your Debit is:       " + debitAmount.ToString());
        myAccountBalance = myAccountBalance - amount;
        Console.Writeline("Your New Balance is: " + myAccountBalance.ToString());
    }
}

假设您的妻子在一个线程上运行此类的一个实例(“副本”),而您在另一个线程上运行一个实例。 myAccountBalance 变量被声明为静态的,以允许它在两个正在运行的实例之间共享(您和您的妻子只有一个支票账户)。

您可以通过调用如下代码进行扣款:

MyBanking bankingObject = new MyBanking();
bankingObject.DebitAccount(100);

你的妻子同时记账:

MyBanking bankingObject = new MyBanking();
bankingObject.DebitAccount(50);

如果在屏幕上打印旧余额之后但在打印新余额之前您的线程被您妻子的线程打断,会发生什么情况?你妻子的线程从帐户中扣除并将控制权返回给你的线程。你的妻子在屏幕上看到了这个:

Your Old Balance is: 2000
Your Debit is:       50
Your New Balance Is: 1950

当计算机在您的屏幕上打印新余额时,它会出错,因为您妻子的借方也将被计算在内。你会看到这样的东西:

Your Old Balance is: 2000
Your Debit is:       100
Your New Balance Is: 1850

为了解决这个问题,我们用 lock 语句包围我们的方法代码。锁定语句导致所有其他线程等待我们的实例完成。新代码如下所示:

public class MyBanking
{
    static double myAccountBalance;
    //
    public void DebitAccount(double debitAmount)
    {
        lock (this)
        {
            Console.Writeline("Your Old Balance is: " + myAccountBalance.ToString());
            Console.Writeline("Your Debit is:       " + debitAmount.ToString());
            myAccountBalance = myAccountBalance - amount;
            Console.Writeline("Your New Balance is: " + myAccountBalance.ToString());
        }
    }
}

在您妻子的代码开始执行之前,您妻子的线程现在将等待 lock 语句中的代码执行完毕。您的新余额现在将是正确的,因为在您完成交易时,您妻子的线程不再有可能更改余额。在您的屏幕上,您现在将看到:

Your Old Balance is: 2000
Your Debit is:       100
Your New Balance Is: 1900

你的妻子会看到这个:

Your Old Balance is: 1900
Your Debit is:       50
Your New Balance Is: 1850

这是同步。

关于c# - 什么是条件同步?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/902137/

相关文章:

c# - 究竟什么是 PLINQ?

java - 线程安全但快速访问 "eventually final"变量?

java - Android游戏循环中的同步

synchronization - 使用信号量实现监视器

excel - 将格式信息编码到 Google 表格或 Excel 公式中

mysql - 如果不满足条件,则替换满足条件的行中的值

MySQL 有条件插入

c# - 绑定(bind)ContentPresenter的内容

C# DynamoDB 复杂类型 IList<T> 转换器

c# - Solution Explorer 文件中的 VS2010 插件自定义菜单项