java并发编程实战(3):“juc”—锁,lock-编程开发技术

java并发编程实战(3):“juc”—锁,lock-编程开发技术

ID:31191927

大小:72.50 KB

页数:5页

时间:2019-01-07

java并发编程实战(3):“juc”—锁,lock-编程开发技术_第1页
java并发编程实战(3):“juc”—锁,lock-编程开发技术_第2页
java并发编程实战(3):“juc”—锁,lock-编程开发技术_第3页
java并发编程实战(3):“juc”—锁,lock-编程开发技术_第4页
java并发编程实战(3):“juc”—锁,lock-编程开发技术_第5页
资源描述:

《java并发编程实战(3):“juc”—锁,lock-编程开发技术》由会员上传分享,免费在线阅读,更多相关内容在工程资料-天天文库

1、Java并发编程实战(3):“J.U.C”一锁,lock-编程开发技术Java并发编程实战(3):“J.U・C”一锁,lock原文出处:chenssy在java屮冇两种方法实现锁机制,一种是在前一篇博客屮(Java并发编程实战(2):synchronized)介绍的synchronized,而另一种是比synchronized更加强大和灵活的Lock0Lock确保当一个线程位于代码的临界区时,另一个线程不进入临界区,相对于synchronized,Lock接口及其实现类提供了更加强大、灵活的锁机制。一个简单的锁在使用synchr

2、onizedII寸,我们是这样使用锁的:publicclassThreadTest{publicvoidtcst(){synchronized(this){//dosomething}}}synchronized可以确保在同一时间内只有一个线程在执行dosomethingo下面是使用lock替代synchronized:publicclassThreadiest{Locklock=newLock();publicvoidtcst(){lock.lock();//dosomethinglock,uniock();}}lock()方

3、法会对Lock实例对象进行加锁,因此所冇对该对彖调用lockO方法的线程都会被阻塞,直到该Lock对彖的unlock()方法被调用。【以下引自:Java中的锁】publicclassLock{privatebooleanisLocked=false;publicsynchronizedvoidlock()throwsTnterruptedException{while(isLocked){wait();}isLocked二true;}publicsynchronizedvoidunlock(){isLocked=false;no

4、tify();}当isLocked为true时,调用lock()的线程在wait()调用上阻塞等待。为防止该线程没有收到notify()调用也从waitO中返冋,这个线程会重新去检查isLocked条件以决定当前是否可以安全地继续执行还是需要重新保持等待,而不是认为线程被唤醒了就可以安全地继续执行了。如果isLocked为false,当前线程会退出while(isLocked)循环,并将isLocked设冋true,让其它正在调用lock()方法的线程能够在Lock实例上加锁。锁的公平性公平性的对立面是饥饿。那么什么是“饥饿”呢

5、?如果i个线程因为其他线程在一直抢占着CPU而得不到CPU运行时间,那么我们就称该线程被“饥饿致死”。而解决饥饿的方案则被称Z为“公平性”一一所有线程均可以公平地获得CPU运行机会。导致线程饥饿主要有如下儿个原因:高优先级线程吞噬所有的低优先级线程的CPU时间。我们可以为每个线程单独设置其优先级,从1到10。优先级越高的线程获得CPU的时间越多。对大多数应用來说,我们最好是不要改变其优先级值。线程被永久堵塞在一个等待进入同步块的状态。java的同步代码区是导致线程饥饿的重要因素。走阳的同步代码块并不会保证进入它的线程的先后顺序。

6、这就意味着理论上存在一个或者多个线程在试图进入同步代码区吋永远被堵塞着,因为其他线程总是不断优于他获得访问权,导致它一直得到不到CPU运行机会被“饥饿致死”。线程在等待一个本身也处于永久等待完成的对象。如果多个线程处在wait()方法执行上,而对其调用notify()不会保证哪一个线程会获得唤醍,任何线程都冇可能处于继续等待的状态。因此存在这样一个风险:一个等待线程从来得不到唤醍,因为其他等待线程总是能被获得唤醍。为了解决线程“饥饿”的问题,我们可以使用锁实现公平性。锁的可重入性我们知道当线程请求一个由其它线程持有锁的对象时,该

7、线程会阻塞,但是当线程请求由自己持冇锁的对象时,是否可以成功呢?答案是可以成功的,成功的保障就是线程锁的“可重入性”。“可重入”意味着自己可以再次获得自己的内部锁,而不需耍阻塞。如下:publicclassFather{publicsynchronizedvoidmethod(){//dosomethingpublicclassChildextendsFather{publicsynchronizedvoidmethod(){//dosomethingsuper,method();}}如果所是不可重入的,上面的代码就会死锁,因为

8、调用ch订d的method(),首先会获取父类Father的内置锁然后获取Child的内置锁,当调用父类的方法时,需要再次后去父类的内置锁,如果不可重入,可能会陷入死锁。java多线程的可重入性的实现是通过每个锁关联一个请求计算和一个占有它的线程,当计数为0时,

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

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

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