我去面试一个C#工作的时候,碰到这么个问题:以下是一个类的定义:
public class StockRoom
{
private int stockLevel = 0;public void DecrementStockLevel()
{
if ( stockLevel > 0 )
stockLevel --;
Debug.Assert ( stockLevel >= 0 )
}public void IncrementStockLevel()
{
stockLevel ++;
}
}在多线程并发运行的环境中,Debug.Assert在这里有时候会报错,请问如何纠正。我的回答是:
public class StockRoom
{
private int stockLevel = 0;public void DecrementStockLevel()
{
try {
lock(this) {
if ( stockLevel > 0 )
stockLevel --;
Thread.Sleep(1);
}
Debug.Assert ( stockLevel >= 0 );
}public void IncrementStockLevel()
{
stockLevel ++;
}
}
这样的回答对吗?我应该怎么回答这样的问题呢?
public class StockRoom
{
private int stockLevel = 0;public void DecrementStockLevel()
{
if ( stockLevel > 0 )
stockLevel --;
Debug.Assert ( stockLevel >= 0 )
}public void IncrementStockLevel()
{
stockLevel ++;
}
}在多线程并发运行的环境中,Debug.Assert在这里有时候会报错,请问如何纠正。我的回答是:
public class StockRoom
{
private int stockLevel = 0;public void DecrementStockLevel()
{
try {
lock(this) {
if ( stockLevel > 0 )
stockLevel --;
Thread.Sleep(1);
}
Debug.Assert ( stockLevel >= 0 );
}public void IncrementStockLevel()
{
stockLevel ++;
}
}
这样的回答对吗?我应该怎么回答这样的问题呢?
try {
lock(this) {
if ( stockLevel > 0 )
stockLevel --;
Thread.Sleep(1);
}
} catch {
...... //Code来处理异常
}
if ( stockLevel > 0 )
stockLevel --;
这段代码进行互斥即可,而后面一句则不用加try-catch。例如:
private static Mutex m = null ;// define as one of class memberspublic void DecrementStockLevel()
{
if( m == null ) m = new Mutex();
m.WaitOne();
if ( stockLevel > 0 )
stockLevel --;
m.ReleaseMutex();Debug.Assert ( stockLevel >= 0 )
}
public void DecrementStockLevel()
{
int tmp = stockLevel;
if ( tmp > 0 )
tmp --;Debug.Assert ( tmp >= 0 )
stockLevel = tmp;
}