今天做一个框架,我想把底层封装一个公共的方法,基层继承于此方法。但是,突然我想到一个问题,在实例化子类,调用基类方法的时候,会不会造成相互影响呢?例如,子类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" onclick="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" onclick="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" onclick="return Button3_onclick()" /> </td> </tr> </table> </div> </form> </body> </html>
当我们先点按钮1 再点按钮二的时候,却总是发现。按钮2的值要等按钮1的值出来以后,再等5秒才会出现。这个就是一个需要大家重视的问题。如果我们在架构架构的时候,把数据缓存提取出来作为一个功能的类,那一定会发现,当某功能引起方法锁住的时候,后面的方法只能依次等待。反而让我们的系统的并发性大大减少。
父类锁让并发减少,架构中不得不注意的问题,布布扣,bubuko.com
原文:http://blog.csdn.net/jacky4955/article/details/23455353