并发性能优化:降低锁粒度-编程开发技术

并发性能优化:降低锁粒度-编程开发技术

ID:31030463

大小:73.00 KB

页数:4页

时间:2019-01-05

并发性能优化:降低锁粒度-编程开发技术_第1页
并发性能优化:降低锁粒度-编程开发技术_第2页
并发性能优化:降低锁粒度-编程开发技术_第3页
并发性能优化:降低锁粒度-编程开发技术_第4页
资源描述:

《并发性能优化:降低锁粒度-编程开发技术》由会员上传分享,免费在线阅读,更多相关内容在学术论文-天天文库

1、并发性能优化:降低锁粒度-编程开发技术并发性能优化:降低锁粒度译文出处:买蓉原文出处:AdrianosDadis在高负载多线程应用中性能是非常重要的。为了达到更好的性能,开发者必须意识到并发的重要性。当我们需要使用并发时,常常有一个资源必须被两个或多个线程共享。在这种情况下,就存在一个竞争条件,也就是其中一个线程可以得到锁(锁与特定资源绑定),其他想耍得到锁的线程会被阻塞。这个同步机制的实现是有代价的,为了向你提供一个好用的同步模型,JVH和操作系统都要消耗资源。有三个最重要的因素使并发的实现会消耗大量资源,它们是:•上下

2、文切换•内存同步•阻塞为了写出针对同步的优化代码,你必须认识到这三个因索以及如何减少它们。在写这样的代码时你需要注意很多东西。在本文中,我会向你介绍一种通过降低锁粒度的技术来减少这些因素。让我们从一个基木原则开始:不要长时间持有不必要的锁。在获得锁之前做完所有需要做的事,只把锁用在需要同步的资源上,用完之后立即释放它。我们來看一个简单的例子:publicclassIlclloSync{privateMapdictionary=newHashMapO;publicsynchronizedvoidborringDevelope

3、r(Stringkey,Stringvalue){longstartTime二(newjava.util.DateO).getTimeO;value=value+z,_z,+startTimc;dictionary.put(key,value);System,out・println("Ididthisin"+((newjava.util.Date()).getTime()-startTime)+,zmiliseconds〃);}在这个例子中,我们违反了基本原则,因为我们创建了两个Date对象,调用了System,out.p

4、rintin(),还做了很多次String连接操作,但唯一需要做同步的操作是udictionary,put(key,value)o讣我们来修改代码,把同步方法变成只包含这句的同步块,得到下面更优化的代码:publicclassHelloSync{privateMapdictionary=newHashMap();publicvoidborringDeveloper(Stringkey,Stringvalue){longstartTime=(newjava.util.Date()).getTime();value二value

5、+,z_,z+startTimc;synchronized(dictionary){dictionary,put(key,value);}System,out.println(z,Tdidthisin〃+((newjava,uti1.Date())•gctTime()-startTime)miliseconds〃);上面的代码可以进-步优化,但这里只想传达出这种想法。如果你对如何进一步优化感兴趣,请参考java.util,concurrent.ConcurrentllashMap.那么,我们怎么降低锁粒度呢?简单來说,就是

6、通过尽可能少的请求锁。基本的想法是,分别用不同的锁来保护同一个类屮多个独立的状态变量,而不是对整个类域只使用一个锁。我们来看下面这个我在很多应用中见到过的简单例子:publicclassGrocery{privatefinalArrayListfruits=newArrayList();privatefinalArrayListvegetables二newArrayList();publicsynchronizedvoidaddFruit(intindex,Stringfruit){fruits,add(index,fru

7、it);}publicsynchronizedvoidremoveFruit(intindex){fruits,remove(index);}publicsynchronizedvoidaddVegetable(intindex,Stringvegetable){vegetables,add(index,vegetable);}publicsynchronizedvoidremoveVegetable(intindex){vegetables,remove(index);}}杂货丿占主可以对他的杂货铺屮的蔬菜和水果进行添加

8、/删除操作。上面对朵货铺的实现,通过基本的Grocery锁来保护fruits和vegetables,因为同步是在方法域完成的。事实上,我们可以不使用这个大范围的锁,而是针对每个资源(fruits和vegetables)分别使用一个锁。来看一下改进后的代码:publicclassGrocery{priva

当前文档最多预览五页,下载文档查看全文

此文档下载收益归作者所有

当前文档最多预览五页,下载文档查看全文
温馨提示:
1. 部分包含数学公式或PPT动画的文件,查看预览时可能会显示错乱或异常,文件下载后无此问题,请放心下载。
2. 本文档由用户上传,版权归属用户,天天文库负责整理代发布。如果您对本文档版权有争议请及时联系客服。
3. 下载前请仔细阅读文档内容,确认文档内容符合您的需求后进行下载,若出现内容与标题不符可向本站投诉处理。
4. 下载文档时可能由于网络波动等原因无法下载或下载错误,付费完成后未能成功下载的用户请联系客服处理。