Welcome to OGeek Q&A Community for programmer and developer-Open, Learning and Share
Welcome To Ask or Share your Answers For Others

Categories

0 votes
3.6k views
in Technique[技术] by (71.8m points)

如何基于相同字符串上锁?

我有一个方法,接受一个字符串入参,方法会被并发调用,我想在传入相同字符串的调用间上锁,比如有两个线程同时传入"abc"调用该方法,那我希望他们不能同时进入,需等一个完成另一个才进入。与此同时,另一个线程传入"xyz"的调用则不受影响。所以我应该锁什么?

void Foo(string s) {
  lock(what) { } // ???
}

我现在锁的是String.Intern(s),但了解到这样会增加不可回收的驻留字符串,而这个方法在程序运行期间是会被传入无数不同的字符串调用无数次的,所以驻留下来的字符串会很可观,所以我想改进。

求支招,谢谢!


与恶龙缠斗过久,自身亦成为恶龙;凝视深渊过久,深渊将回以凝视…
Welcome To Ask or Share your Answers For Others

1 Reply

0 votes
by (71.8m points)

好像在内核看到过一个类似问题的解决方案:把字符串哈希到固定数量的桶,每个桶一把锁。

同一个桶里的不同串确实会互相影响,但是根据问题的具体情况可以调整桶数,让冲突的概率降低。

桶里可以有很多串,只要两个不同的串同时需要锁的概率够低就可以。加锁的持续时间越长,冲突可能性就越大。


与恶龙缠斗过久,自身亦成为恶龙;凝视深渊过久,深渊将回以凝视…
OGeek|极客中国-欢迎来到极客的世界,一个免费开放的程序员编程交流平台!开放,进步,分享!让技术改变生活,让极客改变未来! Welcome to OGeek Q&A Community for programmer and developer-Open, Learning and Share
Click Here to Ask a Question

...