小米6苹果抬起唤醒功能还要多久

& & 介绍 & Java 6中的线程优化& & Sun、IBM、BEA和其他公司在各自实现的Java 6虚拟机上都花费了大量的精力优化锁的管理和同步。诸如偏向锁(biased locking)、锁粗化(lock coarsening)、由逸出(escape)分析产生的锁省略、自适应自旋锁(ad……
声明:该文章系网友上传分享,此内容仅代表网友个人经验或观点,不代表本网站立场和观点;若未进行原创声明,则表明该文章系转载自互联网;若该文章内容涉嫌侵权,请及时向
论文写作技巧
上一篇:下一篇:
相关经验教程在本文的第一部分中,我们通过一个单一线程的基准,比较了同步的 StringBuffer和非同步的StringBuilder之间的性能。从最初的基准测试结果来看 ,偏向锁提供了最佳的性能,比其他的优化方式更有效。测试的结果似乎表明获 取锁是一项昂贵的操作。但是在得出最终的结论……
声明:该文章系网友上传分享,此内容仅代表网友个人经验或观点,不代表本网站立场和观点;若未进行原创声明,则表明该文章系转载自互联网;若该文章内容涉嫌侵权,请及时向
论文写作技巧
上一篇:下一篇:
相关经验教程温馨提示!由于新浪微博认证机制调整,您的新浪微博帐号绑定已过期,请重新绑定!&&|&&
LOFTER精选
网易考拉推荐
用微信&&“扫一扫”
将文章分享到朋友圈。
用易信&&“扫一扫”
将文章分享到朋友圈。
public&class&LeftRightDeadlock&{&&&&&&private&final&Object&left&=&new&Object();&&&&&&private&final&Object&right&=&new&Object();&&&&&&public&void&leftRight()&{&&&&&&&&&&synchronized&(left)&{&&&&&&&&&&&&&&synchronized&(right)&{&&&&&&&&&&&&&&&&&&doSomething();&&&&&&&&&&&&&&}&&&&&&&&&&}&&&&&&}&&&&&&public&void&rightLeft()&{&&&&&&&&&&synchronized&(right)&{&&&&&&&&&&&&&&synchronized&(left)&{&&&&&&&&&&&&&&&&&&doSomethingElse();&&&&&&&&&&&&&&}&&&&&&&&&&}&&&&&&}&&}&&预防和处理死锁的方法:1)尽量不要在释放锁之前竞争其他锁一般可以通过细化同步方法来实现,只在真正需要保护共享资源的地方去拿锁,并尽快释放锁,这样可以有效降低在同步方法里调用其他同步方法的情况2)顺序索取锁资源如果实在无法避免嵌套索取锁资源,则需要制定一个索取锁资源的策略,先规划好有哪些锁,然后各个线程按照一个顺序去索取,不要出现上面那个例子中不同顺序,这样就会有潜在的死锁问题3)尝试定时锁Java 5提供了更灵活的锁工具,可以显式地索取和释放锁。那么在索取锁的时候可以设定一个超时时间,如果超过这个时间还没索取到锁,则不会继续堵塞而是放弃此次任务,示例代码如下:public&boolean&trySendOnSharedLine(String&message,&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&long&timeout,&TimeUnit&unit)&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&throws&InterruptedException&{&&&&&&long&nanosToLock&=&unit.toNanos(timeout)&&&&&&&&&&&&&&&&&&&&&&&-&estimatedNanosToSend(message);&&&&&&if&(!lock.tryLock(nanosToLock,&NANOSECONDS))&&&&&&&&&&return&false;&&&&&&try&{&&&&&&&&&&return&sendOnSharedLine(message);&&&&&&}&finally&{&&&&&&&&&&lock.unlock();&&&&&&}&&}&&这样可以有效打破死锁条件。4)检查死锁JVM采用thread dump的方式来识别死锁的方式,可以通过操作系统的命令来向JVM发送thread dump的信号,这样可以查询哪些线程死锁。过多串行化用多线程实际上就是想并行地做事情,但这些事情由于某些依赖性必须串行工作,导致很多环节得串行化,这实际上很局限系统的可扩展性,就算加CPU加线程,但性能却没有线性增长。有个Amdahl定理可以说明这个问题:其中,F是串行化比例,N是处理器数量,由上可知,只有尽可能减少串行化,才能最大化地提高可扩展能力。降低串行化的关键就是降低锁竞争,当很多并行任务挂在锁的获取上,就是串行化的表现过多锁竞争过多锁竞争的危害是不言而喻的,那么看看有哪些办法来降低锁竞争1)缩小锁的范围前面也谈到这一点,尽量缩小锁保护的范围,快进快出,因此尽量不要直接在方法上使用synchronized关键字,而只是在真正需要线程安全保护的地方使用2)减小锁的粒度Java 5提供了显式锁后,可以更为灵活的来保护共享变量。synchronized关键字(用在方法上)是默认把整个对象作为锁,实际上很多时候没有必要用这么大一个锁,这会导致这个类所有synchronized都得串行执行。可以根据真正需要保护的共享变量作为锁,也可以使用更为精细的策略,目的就是要在真正需要串行的时候串行,举一个例子:public&class&StripedMap&{&&&&&&//&Synchronization&policy:&buckets[n]&guarded&by&locks[n%N_LOCKS]&&&&&&private&static&final&int&N_LOCKS&=&16;&&&&&&private&final&Node[]&&&&&&&private&final&Object[]&&&&&&&private&static&class&Node&{&...&}&&&&&&public&StripedMap(int&numBuckets)&{&&&&&&&&&&buckets&=&new&Node[numBuckets];&&&&&&&&&&locks&=&new&Object[N_LOCKS];&&&&&&&&&&for&(int&i&=&0;&i&&&N_LOCKS;&i++)&&&&&&&&&&&&&&locks[i]&=&new&Object();&&&&&&}&&&&&&private&final&int&hash(Object&key)&{&&&&&&&&&&return&Math.abs(key.hashCode()&%&buckets.length);&&&&&&}&&&&&&public&Object&get(Object&key)&{&&&&&&&&&&int&hash&=&hash(key);&&&&&&&&&&synchronized&(locks[hash&%&N_LOCKS])&{&&&&&&&&&&&&&&for&(Node&m&=&buckets[hash];&m&!=&null;&m&=&m.next)&&&&&&&&&&&&&&&&&&if&(m.key.equals(key))&&&&&&&&&&&&&&&&&&&&&&return&m.&&&&&&&&&&}&&&&&&&&&&return&null;&&&&&&}&&&&&&public&void&clear()&{&&&&&&&&&&for&(int&i&=&0;&i&&&buckets.&i++)&{&&&&&&&&&&&&&&synchronized&(locks[i&%&N_LOCKS])&{&&&&&&&&&&&&&&&&&&buckets[i]&=&null;&&&&&&&&&&&&&&}&&&&&&&&&&}&&&&&&}&&&&&&...&&}&&上面这个例子是通过hash算法来把存取的值所对应的hash值来作为锁,这样就只需要对hash值相同的对象存取串行化,而不是像HashTable那样对任何对象任何操作都串行化。3)减少共享资源的依赖共享资源是竞争锁的源头,在多线程开发中尽量减少对共享资源的依赖,比如对象池的技术应该慎重考虑,新的JVM对新建对象以做了足够的优化,性能非常好,如果用对象池不但不能提高多少性能,反而会因为锁竞争导致降低线程的可并发性。4)使用读写分离锁来替换独占锁Java 5提供了一个读写分离锁(ReadWriteLock)来实现读-读并发,读-写串行,写-写串行的特性。这种方式更进一步提高了可并发性,因为有些场景大部分是读操作,因此没必要串行工作。关于ReadWriteLock的具体使用可以参加一下示例:public&class&ReadWriteMap&K,V&&{&&&&&&private&final&Map&K,V&&&&&&&&private&final&ReadWriteLock&lock&=&new&ReentrantReadWriteLock();&&&&&&private&final&Lock&r&=&lock.readLock();&&&&&&private&final&Lock&w&=&lock.writeLock();&&&&&&public&ReadWriteMap(Map&K,V&&map)&{&&&&&&&&&&this.map&=&&&&&&&}&&&&&&public&V&put(K&key,&V&value)&{&&&&&&&&&&w.lock();&&&&&&&&&&try&{&&&&&&&&&&&&&&return&map.put(key,&value);&&&&&&&&&&}&finally&{&&&&&&&&&&&&&&w.unlock();&&&&&&&&&&}&&&&&&}&&&&&&//&Do&the&same&for&remove(),&putAll(),&clear()&&&&&&public&V&get(Object&key)&{&&&&&&&&&&r.lock();&&&&&&&&&&try&{&&&&&&&&&&&&&&return&map.get(key);&&&&&&&&&&}&finally&{&&&&&&&&&&&&&&r.unlock();&&&&&&&&&&}&&&&&&}&&&&&&//&Do&the&same&for&other&read-only&Map&methods&&}&&切换上下文线程比较多的时候,操作系统切换线程上下文的性能消耗是不能忽略的,在&可以看出在进程切换上的代价,当然线程会更轻量一些,不过道理是类似的内存同步当使用到synchronized、volatile或Lock的时候,都会为了保证可见性导致更多的内存同步,这就无法享受到JMM结构带来了性能优化。
阅读(476)|
用微信&&“扫一扫”
将文章分享到朋友圈。
用易信&&“扫一扫”
将文章分享到朋友圈。
历史上的今天
loftPermalink:'',
id:'fks_',
blogTitle:'探索并发编程(六)------Java多线程性能优化',
blogAbstract:'大家使用多线程无非是为了提高性能,但如果多线程使用不当,不但性能提升不明显,而且会使得资源消耗更大。下面列举一下可能会造成多线程性能问题的点:死锁',
blogTag:'',
blogUrl:'blog/static/',
isPublished:1,
istop:false,
modifyTime:4,
publishTime:9,
permalink:'blog/static/',
commentCount:0,
mainCommentCount:0,
recommendCount:0,
bsrk:-100,
publisherId:0,
recomBlogHome:false,
currentRecomBlog:false,
attachmentsFileIds:[],
groupInfo:{},
friendstatus:'none',
followstatus:'unFollow',
pubSucc:'',
visitorProvince:'',
visitorCity:'',
visitorNewUser:false,
postAddInfo:{},
mset:'000',
remindgoodnightblog:false,
isBlackVisitor:false,
isShowYodaoAd:false,
hostIntro:'',
hmcon:'0',
selfRecomBlogCount:'0',
lofter_single:''
{list a as x}
{if x.moveFrom=='wap'}
{elseif x.moveFrom=='iphone'}
{elseif x.moveFrom=='android'}
{elseif x.moveFrom=='mobile'}
${a.selfIntro|escape}{if great260}${suplement}{/if}
{list a as x}
推荐过这篇日志的人:
{list a as x}
{if !!b&&b.length>0}
他们还推荐了:
{list b as y}
转载记录:
{list d as x}
{list a as x}
{list a as x}
{list a as x}
{list a as x}
{if x_index>4}{break}{/if}
${fn2(x.publishTime,'yyyy-MM-dd HH:mm:ss')}
{list a as x}
{if !!(blogDetail.preBlogPermalink)}
{if !!(blogDetail.nextBlogPermalink)}
{list a as x}
{if defined('newslist')&&newslist.length>0}
{list newslist as x}
{if x_index>7}{break}{/if}
{list a as x}
{var first_option =}
{list x.voteDetailList as voteToOption}
{if voteToOption==1}
{if first_option==false},{/if}&&“${b[voteToOption_index]}”&&
{if (x.role!="-1") },“我是${c[x.role]}”&&{/if}
&&&&&&&&${fn1(x.voteTime)}
{if x.userName==''}{/if}
网易公司版权所有&&
{list x.l as y}
{if defined('wl')}
{list wl as x}{/list}

我要回帖

更多关于 苹果抬起唤醒功能 的文章

 

随机推荐