听起来你的教授正在谈论线程.线程使计算机程序一次可以执行多项操作.在一个已经运行的情况下启动新线程的行为被计算机程序员称为"旋转线程".
线程可以共享相同的内存空间.条件同步(或仅仅是同步)是保护内存区域不被同时由两个不同线程修改的任何机制.
假设你在外面购物,妻子在家里付账单.这是一个天真的例子,它在现实生活中并没有真正起作用,但它将作为一个简单的例子.
你的妻子正在网上支付账单.与此同时,您正在杂货店刷信用卡.这两种行为都涉及将钱从支票账户中转出.要模拟此活动,我们编写以下代码:
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());
}
}
Run Code Online (Sandbox Code Playgroud)
假设,您的妻子在一个线程上运行此类的一个实例("复制"),您正在另一个线程上运行实例.myAccountBalance变量被声明为static,以允许它在两个正在运行的实例之间共享(您和您的妻子只有一个支票帐户).
您可以通过调用以下代码来进行借记:
MyBanking bankingObject = new MyBanking();
bankingObject.DebitAccount(100);
Run Code Online (Sandbox Code Playgroud)
你的妻子在同一时间扣款:
MyBanking bankingObject = new MyBanking();
bankingObject.DebitAccount(50);
Run Code Online (Sandbox Code Playgroud)
如果您的妻子的线程在屏幕上打印旧余额后,但在打印新余额之前,您的线程会被中断?你妻子的帖子借记帐户并将控制权返还给你的帖子.你的妻子在屏幕上看到了这个:
Your Old Balance is: 2000
Your Debit is: 50
Your New Balance Is: 1950
Run Code Online (Sandbox Code Playgroud)
当计算机在屏幕上打印新余额时,这将是错误的,因为您的妻子的借记也将被计算在内.你会看到这样的东西:
Your Old Balance is: 2000
Your Debit is: 100
Your New Balance Is: 1850
Run Code Online (Sandbox Code Playgroud)
要解决这个问题,我们使用lock语句包含方法代码.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());
}
}
}
Run Code Online (Sandbox Code Playgroud)
在您妻子的代码开始执行之前,您妻子的线程现在将等待锁定语句中的代码完成执行.您的新余额现在是正确的,因为在您完成交易时,您妻子的线程不再可能更改余额.在屏幕上,您现在将看到:
Your Old Balance is: 2000
Your Debit is: 100
Your New Balance Is: 1900
Run Code Online (Sandbox Code Playgroud)
你的妻子会看到这个:
Your Old Balance is: 1900
Your Debit is: 50
Your New Balance Is: 1850
Run Code Online (Sandbox Code Playgroud)
这是同步.
| 归档时间: |
|
| 查看次数: |
6399 次 |
| 最近记录: |