今天做一个框架,我想把底层封装一个公共的方法,基层继承于此方法。但是,突然我想到一个问题,在实例化子类,调用基类方法的时候,会不会造成相互影响呢?例如,子类1 在调用基类方法的时候 锁住了,那会不会造成 其他子类实例化调用的 堵塞呢?
于是做了一个测试,先上基类和子类的代码:
public class LockClass
{
private static object ulock = new object();
public DateTime BaseLockClass(int value)
{
lock (ulock)
{
DateTime date =DateTime.Now;
if (value == 1)
{
Thread.Sleep(1000 * 10);
}
else if (value == 2)
{
Thread.Sleep(1000 * 5);
}
return date;
}
}
}
public class SonA : LockClass
{
}
public class SonB : LockClass
{
}
public class SonC : LockClass
{
}
在我基类中,我有一个方法,这个方法包含一个锁,同时针对不同类型,我暂停的时间不一样,如果值是1 则暂停10秒再往下面执行,如果是2 则暂时5秒,如果是3则不等待。
下面是测试页面CS:
protected void Page_Load(object sender, EventArgs e)
{
if (!IsPostBack)
{
string Type = Request.QueryString["type"] ?? string.Empty;
if (!string.IsNullOrEmpty(Type))
{
if (Type == "1")
{
Response.Write(new SonA().BaseLockClass(1).ToString("HH时mm分ss秒"));
}
else if (Type == "2")
{
Response.Write(new SonB().BaseLockClass(2).ToString("HH时mm分ss秒"));
}
else if (Type == "3")
{
Response.Write(new SonC().BaseLockClass(3).ToString("HH时mm分ss秒"));
}
Response.End();
}
}
}
在测试页面中则比较简单,我根据前台传值的不一样,调用不同的子类方法。同时进行输出。
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
<html xmlns="http://www.w3.org/1999/xhtml">
<head runat="server">
<title></title>
<script src="/Dialog/jquery-1.7.1.js" type="text/javascript"></script>
<script language="javascript" type="text/javascript">
function Button1_onclick() {
$.get("LockTest.aspx?type=1&date=" + new Date(), function (data) {
$("#TextBox1").val(data);
})
}
function Button2_onclick() {
$.get("LockTest.aspx?type=2&date=" + new Date(), function (data) {
$("#TextBox2").val(data);
})
}
function Button3_onclick() {
$.get("LockTest.aspx?type=3&date=" + new Date(), function (data) {
$("#TextBox3").val(data);
})
}
</script>
</head>
<body>
<form id="form1" runat="server">
<div>
<table>
<tr>
<td>
值一(延迟10秒):
</td>
<td>
<asp:TextBox ID="TextBox1" runat="server"></asp:TextBox>
</td>
<td>
<input id="Button1" type="button" value="button" οnclick="return Button1_onclick()" />
</td>
</tr>
<tr>
<td>
值二(延迟5秒):
</td>
<td>
<asp:TextBox ID="TextBox2" runat="server"></asp:TextBox>
</td>
<td>
<input id="Button2" type="button" value="button" οnclick="return Button2_onclick()" />
</td>
</tr>
<tr>
<td>
值三(没有延迟):
</td>
<td>
<asp:TextBox ID="TextBox3" runat="server"></asp:TextBox>
</td>
<td>
<input id="Button3" type="button" value="button" οnclick="return Button3_onclick()" />
</td>
</tr>
</table>
</div>
</form>
</body>
</html>
当我们先点按钮1 再点按钮二的时候,却总是发现。按钮2的值要等按钮1的值出来以后,再等5秒才会出现。这个就是一个需要大家重视的问题。如果我们在架构架构的时候,把数据缓存提取出来作为一个功能的类,那一定会发现,当某功能引起方法锁住的时候,后面的方法只能依次等待。反而让我们的系统的并发性大大减少。