有条件的同步方法

    在做多线程程序时我们可能要对某段代码的同步是有条件的,只有对满足同一条件的请求才排队访问,对与不满足这样条件的请求可以并发访问,在处理这样的需求的时候我们可以容易的想到,对于这个特定的条件做一个抽象,让它作为我们同步锁。下面的代码可以说明这个处理过程:
 1 
 2 // 定义锁
 3 private Map locks = new HashMap();
 4 private Object getLock(Object key) {
 5     synchronized (locks) {
 6         if (!locks.containsKey(key)) {
 7             locks.put(key, new Object());
 8         }
 9         return locks.get(key);
10     }
11 }
12 
13 // 需要同步的代码
14 synchronized (getLock(id)) {
15     // TODO
16 }
17 
18 

posted on 2006-10-09 14:27 Xueping Yang 阅读(1235) 评论(6)  编辑  收藏 所属分类: 技术文章

评论

# re: 有条件的同步方法 2006-10-09 16:28 GHawk

Java 5开始内置的java.util.concurrent.locks包里面有pthread-like的Lock和Condition,很方便。  回复  更多评论   

# re: 有条件的同步方法 2006-10-09 17:54 Xueping Yang

@GHawk
对于我的这个需求来说,上面的代码可能已经是最简单的呢,要是用concurrent的话必须要tiger啦。  回复  更多评论   

# re: 有条件的同步方法 2006-10-09 19:41 stoneshao

呵呵,有意思,毕竟现在的应用服务器都是在jdk1.4下,不能用tiger  回复  更多评论   

# re: 有条件的同步方法 2006-10-09 19:42 stoneshao

但是有一个专门做线程同步的包:concurrent.jar,没有仔细研究它的实现,应该有类似的实现  回复  更多评论   

# re: 有条件的同步方法 2006-10-09 22:36 Alex

上面的所有方法都是同步的,什么时候不同步,代码里体现了么?
synchronized (getLock(id)) {
15 // TODO
16 }
是同步的,它调用的getLock(id)里面也都是同步的,除非在方法
synchronized (locks) {}的外面再加一个其他条件的代码才能算是吧?

还是你省略了这些代码?  回复  更多评论   

# re: 有条件的同步方法 2006-10-10 10:10 GHawk

@stoneshao
util.concurrent 的确有一个backport可以在1.4jvm上使用
http://dcl.mathcs.emory.edu/util/backport-util-concurrent

自己实现多线程的东西还是比较容易出现问题的,debug和性能分析都可能花费大量的时间,个人感觉还是用现有的库更容易一些。  回复  更多评论   


只有注册用户登录后才能发表评论。


网站导航:
 

导航

<2006年10月>
24252627282930
1234567
891011121314
15161718192021
22232425262728
2930311234

统计

常用链接

留言簿(1)

随笔分类

随笔档案

文章分类

技术

朋友

搜索

最新评论