作者:RAL-1314921 | 来源:互联网 | 2023-10-10 13:58
今天做一个框架,我想把底层封装一个公共的方法,基层继承于此方法。但是,突然我想到一个问题,在实例化子类,调用基类方法的时候,会不会造成相互影响呢?例如,子类1在调用基类方法的时候锁
今天做一个框架,我想把底层封装一个公共的方法,基层继承于此方法。但是,突然我想到一个问题,在实例化子类,调用基类方法的时候,会不会造成相互影响呢?例如,子类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();
}
}
}
在测试页面中则比较简单,我根据前台传值的不一样,调用不同的子类方法。同时进行输出。
当我们先点按钮1 再点按钮二的时候,却总是发现。按钮2的值要等按钮1的值出来以后,再等5秒才会出现。这个就是一个需要大家重视的问题。如果我们在架构架构的时候,把数据缓存提取出来作为一个功能的类,那一定会发现,当某功能引起方法锁住的时候,后面的方法只能依次等待。反而让我们的系统的并发性大大减少。
父类锁让并发减少,架构中不得不注意的问题,布布扣,bubuko.com