最近在开发项目中遇到了需要防止某个人的操作并发的问题,因此考虑到加锁;
问题来了:
如果只是对需要操作的地方 加全局锁,必然影响系统整体吞吐量;
代码如下:
class Test
{
private static object objlock = new object();
public void FuncA(string usercode)
{
lock(objlock)
{
//执行操作
}
}
}这样固然可以但是发现所有的用户共用了一把锁,严重影响吞吐量于是决定优化。决定每人一把锁,
修改代码如下:
class Test
{
public void FuncA(string usercode)
{
lock(usercode)
{
//执行操作
}
}
}但是经过测试锁定无效,并发问题仍然存在,后来经过排查发现问题之所在lock锁定字符串每个字符串再内存中都是一个不同的对象,类似于每人都有一把锁。这当然起不到加锁的目的,经过查阅资料修改代码如下:
class Test
{
public void FuncA(string usercode)
{
lock(string.Intern(usercode))
{
//执行操作
}
}
}经过测试发现问题解决。string.Intern 内部是实例化一个池子如果字符串值一致则系统就不会实例化,直切取出对象,因此问题解决;