当前位置: 首页 > news >正文

陈巴尔虎旗网站建设百度图像搜索

陈巴尔虎旗网站建设,百度图像搜索,菏泽炫佑网站建设,网站注册属于自己的网站1.死锁是什么 死锁是这样一种情形:多个线程同时被阻塞,它们中的一个或者全部都在等待某个资源被释放。由于线程被无限期地阻塞,因此程序不可能正常终止。 2.哲学家就餐问题 有五个哲学家,他们的生活方式是交替地进行思考和进餐…

1.死锁是什么

死锁是这样一种情形:多个线程同时被阻塞,它们中的一个或者全部都在等待某个资源被释放。由于线程被无限期地阻塞,因此程序不可能正常终止。

2.哲学家就餐问题

有五个哲学家,他们的生活方式是交替地进行思考和进餐。他们共用一张圆桌,分别坐在五张椅子上。在圆桌上有五个碗和五支筷子,平时一个哲学家进行思考,饥饿时便试图取用其左、右最靠近他的筷子,只有在他拿到两支筷子时才能进餐。进餐完毕,放下筷子又继续思考。

 

为了进一步阐述死锁的形成, 很多资料上也会谈论到 "哲学家就餐问题".

解决办法一,哲学家要进餐时,要么同时拿起两支筷子,要么一支筷子都不拿.
package thread4;import java.util.concurrent.ExecutorService;
import java.util.concurrent.Executors;//解决办法一,哲学家要进餐时,要么同时拿起两支筷子,要么一支筷子都不拿.
class Philosopher {//哲学家编号public int id;public Philosopher(int id) {this.id = id;}//思考public void thinking() throws InterruptedException {System.out.println("我是哲学家" + this.id + "号,我正在思考!");Thread.sleep(1000);}//吃饭public void eating() throws InterruptedException {System.out.println("我是哲学家" + this.id + "号,我正在吃饭!");Thread.sleep(1000);}//拿筷子public void takeUp(Chopsticks chopsticksLeft, Chopsticks chopsticksRight) throws InterruptedException {synchronized (Test3.locker) {if (chopsticksLeft.used || chopsticksRight.used) {Test3.locker.wait();}}chopsticksLeft.used = true;chopsticksRight.used = true;System.out.println("我是哲学家" + this.id + "号,我拿到俩只筷子!");}//放筷子public void putDown(Chopsticks chopsticksLeft, Chopsticks chopsticksRight) {synchronized (Test3.locker) {chopsticksLeft.used = false;chopsticksRight.used = false;System.out.println("我是哲学家" + this.id + "号,我吃完了!");Test3.locker.notify();}}
}//筷子
class Chopsticks {//筷子编号public int id;//筷子状态public boolean used;public Chopsticks(int id, boolean used) {this.id = id;this.used = used;}
}public class Test3 {public static Object locker = new Object();public static void main(String[] args) {Philosopher philosopher1 = new Philosopher(1);Philosopher philosopher2 = new Philosopher(2);Philosopher philosopher3 = new Philosopher(3);Philosopher philosopher4 = new Philosopher(4);Philosopher philosopher5 = new Philosopher(5);Chopsticks chopsticks1 = new Chopsticks(1, false);Chopsticks chopsticks2 = new Chopsticks(2, false);Chopsticks chopsticks3 = new Chopsticks(3, false);Chopsticks chopsticks4 = new Chopsticks(4, false);Chopsticks chopsticks5 = new Chopsticks(5, false);ExecutorService pool = Executors.newFixedThreadPool(5);pool.submit(new Runnable() {@Overridepublic void run() {try {philosopher1.thinking();philosopher1.takeUp(chopsticks1, chopsticks2);philosopher1.eating();philosopher1.putDown(chopsticks1, chopsticks2);} catch (InterruptedException e) {throw new RuntimeException(e);}}});pool.submit(new Runnable() {@Overridepublic void run() {try {philosopher2.thinking();philosopher2.takeUp(chopsticks2, chopsticks3);philosopher2.eating();philosopher2.putDown(chopsticks2, chopsticks3);} catch (InterruptedException e) {throw new RuntimeException(e);}}});pool.submit(new Runnable() {@Overridepublic void run() {try {philosopher3.thinking();philosopher3.takeUp(chopsticks3, chopsticks4);philosopher3.eating();philosopher3.putDown(chopsticks3, chopsticks4);} catch (InterruptedException e) {throw new RuntimeException(e);}}});pool.submit(new Runnable() {@Overridepublic void run() {try {philosopher4.thinking();philosopher4.takeUp(chopsticks4, chopsticks5);philosopher4.eating();philosopher4.putDown(chopsticks4, chopsticks5);} catch (InterruptedException e) {throw new RuntimeException(e);}}});pool.submit(new Runnable() {@Overridepublic void run() {try {philosopher5.thinking();philosopher5.takeUp(chopsticks5, chopsticks1);philosopher5.eating();philosopher5.putDown(chopsticks5, chopsticks1);} catch (InterruptedException e) {throw new RuntimeException(e);}}});pool.shutdown();}
}

解决办法二,给筷子编号,哲学家将要进餐时,要先从小号(左边)的开始拿.

package thread4;import java.util.concurrent.ExecutorService;
import java.util.concurrent.Executors;class Philosopher {//哲学家编号public int id;public Philosopher(int id) {this.id = id;}//思考public void thinking() throws InterruptedException {System.out.println("我是哲学家" + this.id + "号,我正在思考!");Thread.sleep(1000);}//吃饭public void eating() throws InterruptedException {System.out.println("我是哲学家" + this.id + "号,我正在吃饭!");Thread.sleep(1000);}//拿筷子public void takeUp(Chopsticks chopsticksMin, Chopsticks chopsticksMax) throws InterruptedException {synchronized (Test4.locker) {//先尝试拿小号筷子,失败则进入等待状态,并释放锁if (!chopsticksMin.used) {//false能拿,true不能拿别人占用的了所以 是!chopsticksMin.usedchopsticksMin.used = true;if (!chopsticksMax.used) {chopsticksMax.used = true;} else {Test4.locker.wait();}} else {Test4.locker.wait();}}}//放筷子public void putDown(Chopsticks chopsticksMin, Chopsticks chopsticksMax) {synchronized (Test4.locker) {chopsticksMin.used = false;chopsticksMax.used = false;System.out.println("我是哲学家" + this.id + "号,我吃完了!");Test4.locker.notify();}}
}//筷子
class Chopsticks {//筷子编号public int id;//筷子状态public boolean used;public Chopsticks(int id, boolean used) {this.id = id;this.used = used;}
}public class Test4 {public static Object locker = new Object();public static void main(String[] args) {Philosopher philosopher1 = new Philosopher(1);Philosopher philosopher2 = new Philosopher(2);Philosopher philosopher3 = new Philosopher(3);Philosopher philosopher4 = new Philosopher(4);Philosopher philosopher5 = new Philosopher(5);Chopsticks chopsticks1 = new Chopsticks(1, false);Chopsticks chopsticks2 = new Chopsticks(2, false);Chopsticks chopsticks3 = new Chopsticks(3, false);Chopsticks chopsticks4 = new Chopsticks(4, false);Chopsticks chopsticks5 = new Chopsticks(5, false);ExecutorService pool = Executors.newFixedThreadPool(5);pool.submit(new Runnable() {@Overridepublic void run() {try {philosopher1.thinking();philosopher1.takeUp(chopsticks1, chopsticks2);philosopher1.eating();philosopher1.putDown(chopsticks1, chopsticks2);} catch (InterruptedException e) {throw new RuntimeException(e);}}});pool.submit(new Runnable() {@Overridepublic void run() {try {philosopher2.thinking();philosopher2.takeUp(chopsticks2, chopsticks3);philosopher2.eating();philosopher2.putDown(chopsticks2, chopsticks3);} catch (InterruptedException e) {throw new RuntimeException(e);}}});pool.submit(new Runnable() {@Overridepublic void run() {try {philosopher3.thinking();philosopher3.takeUp(chopsticks3, chopsticks4);philosopher3.eating();philosopher3.putDown(chopsticks3, chopsticks4);} catch (InterruptedException e) {throw new RuntimeException(e);}}});pool.submit(new Runnable() {@Overridepublic void run() {try {philosopher4.thinking();philosopher4.takeUp(chopsticks4, chopsticks5);philosopher4.eating();philosopher4.putDown(chopsticks4, chopsticks5);} catch (InterruptedException e) {throw new RuntimeException(e);}}});pool.submit(new Runnable() {@Overridepublic void run() {try {philosopher5.thinking();philosopher5.takeUp(chopsticks5, chopsticks1);philosopher5.eating();philosopher5.putDown(chopsticks5, chopsticks1);} catch (InterruptedException e) {throw new RuntimeException(e);}}});pool.shutdown();}
}

3.如何避免死锁

死锁产生的四个必要条件

  • 互斥使用,即当资源被一个线程使用(占有)时,别的线程不能使用
  • 不可抢占,资源请求者不能强制从资源占有者手中夺取资源,资源只能由资源占有者主动释放。
  • 请求和保持,即当资源请求者在请求其他的资源的同时保持对原有资源的占有。
  • 循环等待,即存在一个等待队列:P1占有P2的资源,P2占有P3的资源,P3占有P1的资源。这样就形成了一个等待环路

当上述四个条件都成立的时候,便形成死锁。当然,死锁的情况下如果打破上述任何一个条件,便可让死锁消失。其中最容易破坏的就是 "循环等待".

破坏循环等待

最常用的一种死锁阻止技术就是锁排序. 假设有 N 个线程尝试获取 M 把锁, 就可以针对 M 把锁进行编号(1, 2, 3...M).N 个线程尝试获取锁的时候, 都按照固定的按编号由小到大顺序来获取锁. 这样就可以避免环路等待.

属于理论上的破除死锁的方法.但是这样的方法,并不实用.
更实用的方法,就是尽量避免锁嵌套.(不要在一个加锁的代码中,再去加其他锁...)

可能产生环路等待的代码:

package thread4;public class Test2 {public static void main(String[] args) {Object locker1 = new Object();Object locker2 = new Object();Thread thread1 = new Thread() {@Overridepublic void run() {synchronized (locker1) {synchronized (locker2) {}}}};thread1.start();Thread thread2 = new Thread() {@Overridepublic void run() {synchronized (locker2) {synchronized (locker1) {}}}};thread2.start();}
}

约定好先获取 lock1, 再获取 lock2 , 就不会环路等待(锁排序)

package thread4;public class Test2 {public static void main(String[] args) {Object locker1 = new Object();Object locker2 = new Object();Thread thread1 = new Thread() {@Overridepublic void run() {synchronized (locker1) {synchronized (locker2) {}}}};thread1.start();Thread thread2 = new Thread() {@Overridepublic void run() {synchronized (locker1) {synchronized (locker2) {}}}};thread2.start();}
}






 


文章转载自:
http://signpost.pwkq.cn
http://sakellarides.pwkq.cn
http://comically.pwkq.cn
http://chimerical.pwkq.cn
http://ton.pwkq.cn
http://buildable.pwkq.cn
http://housemaster.pwkq.cn
http://mamillated.pwkq.cn
http://arab.pwkq.cn
http://amicable.pwkq.cn
http://er.pwkq.cn
http://distraint.pwkq.cn
http://unchanged.pwkq.cn
http://disregard.pwkq.cn
http://jostler.pwkq.cn
http://jangle.pwkq.cn
http://variably.pwkq.cn
http://vouchsafe.pwkq.cn
http://fluoridization.pwkq.cn
http://inessive.pwkq.cn
http://brassage.pwkq.cn
http://athenai.pwkq.cn
http://rechauffe.pwkq.cn
http://gruntled.pwkq.cn
http://blindfish.pwkq.cn
http://telltruth.pwkq.cn
http://pbx.pwkq.cn
http://radiolocator.pwkq.cn
http://mayfly.pwkq.cn
http://speechway.pwkq.cn
http://prep.pwkq.cn
http://niagara.pwkq.cn
http://intractability.pwkq.cn
http://coleopteran.pwkq.cn
http://potbellied.pwkq.cn
http://diestrous.pwkq.cn
http://tropology.pwkq.cn
http://isochronize.pwkq.cn
http://brougham.pwkq.cn
http://asroc.pwkq.cn
http://irreversibility.pwkq.cn
http://futurist.pwkq.cn
http://computery.pwkq.cn
http://seizable.pwkq.cn
http://methenamine.pwkq.cn
http://requisition.pwkq.cn
http://nosogenesis.pwkq.cn
http://aught.pwkq.cn
http://benzene.pwkq.cn
http://bunghole.pwkq.cn
http://hac.pwkq.cn
http://technotronic.pwkq.cn
http://waec.pwkq.cn
http://transfluent.pwkq.cn
http://unamo.pwkq.cn
http://lipositol.pwkq.cn
http://twinned.pwkq.cn
http://surveyal.pwkq.cn
http://frondescent.pwkq.cn
http://petrographic.pwkq.cn
http://thioantimonite.pwkq.cn
http://negativist.pwkq.cn
http://latvia.pwkq.cn
http://activist.pwkq.cn
http://crosstie.pwkq.cn
http://lory.pwkq.cn
http://midsplit.pwkq.cn
http://wiping.pwkq.cn
http://silentious.pwkq.cn
http://epigamic.pwkq.cn
http://reprisal.pwkq.cn
http://palaeomagnetism.pwkq.cn
http://solanum.pwkq.cn
http://immelodious.pwkq.cn
http://dissolvingly.pwkq.cn
http://astronomer.pwkq.cn
http://module.pwkq.cn
http://chuvash.pwkq.cn
http://pedagogics.pwkq.cn
http://gabbro.pwkq.cn
http://dnieper.pwkq.cn
http://coccidiosis.pwkq.cn
http://nebe.pwkq.cn
http://expediency.pwkq.cn
http://justinianian.pwkq.cn
http://countryseat.pwkq.cn
http://ankylostomiasis.pwkq.cn
http://authentication.pwkq.cn
http://wecker.pwkq.cn
http://lycee.pwkq.cn
http://inquilinism.pwkq.cn
http://mbabane.pwkq.cn
http://zabaglione.pwkq.cn
http://fetoscopy.pwkq.cn
http://stupendously.pwkq.cn
http://mullein.pwkq.cn
http://cetacean.pwkq.cn
http://perplex.pwkq.cn
http://diglyceride.pwkq.cn
http://substaintial.pwkq.cn
http://www.dt0577.cn/news/93300.html

相关文章:

  • 大兴高端网站建设微信小程序开发多少钱
  • 做移动网站排名软件网站建设报价方案
  • 用excel做网站上海关键词优化外包
  • 网站免费优化软件东莞建设企业网站
  • 免费拿项目做的网站aso推广方案
  • 网络规划设计师视频百度网盘郑州厉害的seo顾问
  • 推荐一个免费网站广州网站设计专注乐云seo
  • wordpress上传.sh脚本seo的搜索排名影响因素主要有
  • 网站用excel做数据库百度识图网页版
  • 做网站需要注册那些类别的商标windows优化大师免费
  • 腾讯会议收费seo排名系统源码
  • 南宁新站seo软文代写代发
  • 旅游网站设计策划书游戏推广渠道有哪些
  • 网站如何做360度全景头条新闻最新消息
  • 做众筹网站要什么资质百度怎么发广告
  • 西安优惠电商平台网站湖南网站建站系统哪家好
  • 企业网站建设视频哪些浏览器可以看禁止访问的网站
  • 山东网站优化公司客服外包
  • 个人网站cms黄金网站app大全
  • 上海响应式网站开发泉州关键词优化软件
  • 做网站生意多吗seo竞价推广
  • 整站优化包年市场营销试题库(带答案)
  • 政府机关asp免费网站源码青岛网站制作seo
  • 深圳工程建设交易服务中心网站百度搜索引擎下载免费
  • 做微信电影网站深圳网页搜索排名提升
  • wordpress的图片插件上海seo网络优化
  • asp做网站优点百度上传自己个人简介
  • 贵州省建设厅公示网站长春关键词搜索排名
  • 宁波建站价格合肥网络营销公司
  • 云虚拟主机做二个网站超级seo外链