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

b2b平台怎么做seo应该怎么做

b2b平台怎么做,seo应该怎么做,东莞公共资源交易中心,怎么用优盘做网站登录密钥目录 一、死锁的三种典型场景 1、一个线程,一把锁 2、两个线程,两把锁 3、N个线程,M把锁 死锁,是多线程代码中的一类经典问题。我们知道加锁是能解决线程安全问题的,但是如果加锁的方式不当,就可能产生死…

目录

 一、死锁的三种典型场景

1、一个线程,一把锁

2、两个线程,两把锁

3、N个线程,M把锁


死锁,是多线程代码中的一类经典问题。我们知道加锁是能解决线程安全问题的,但是如果加锁的方式不当,就可能产生死锁。

 一、死锁的三种典型场景

1、一个线程,一把锁

对于不可重入锁来说

一个线程没有释放锁, 然后又尝试再次加锁。
// 第一次加锁, 加锁成功
lock();
// 第二次加锁, 锁已经被占用, 阻塞等待.
lock();
按照之前对于锁的设定, 第二次加锁的时候, 就会阻塞等待. 直到第⼀次的锁被释放, 才能获取到第二个锁. 但是释放第⼀个锁也是由该线程来完成, 结果这个线程已经躺平了, 啥都不想干了, 也就无法进行解锁操作. 这时候就会死锁。

对于这种情况就是,如果锁是不可重入的锁,并且一个线程对这把锁加锁两次,就会出现死锁。

2、两个线程,两把锁

假设有两个线程,线程1获取到锁A(对A对象加锁),线程2获取到锁B(对B对象加锁),接下来,线程1尝试获取锁B,线程2尝试获取锁A,这时就会出现死锁。

示例代码如下:

public class ThreadDemo1 {public static void main(String[] args) {Object A = new Object();Object B = new Object();Thread t1 = new Thread(()->{synchronized (A) {//sleep一下,让t2能拿到Btry {Thread.sleep(1000);}catch (InterruptedException e) {e.printStackTrace();}//在持有A的情况下,对B加锁synchronized (B) {System.out.println("t1拿到了两把锁");}}});Thread t2 = new Thread(()->{synchronized (B) {//sleep一下,让t1能拿到Atry {Thread.sleep(1000);}catch (InterruptedException e) {e.printStackTrace();}//在持有B的情况下,对A加锁synchronized (A) {System.out.println("t2拿到了两把锁");}}});//死锁,一直僵持着,若让t2先对A加锁,再对B加锁,就可避免死锁t1.start();t2.start();}
}

这时候发生死锁,线程就“卡住了”,无法继续工作(死锁属于程序中最严重的一类bug),可见这个代码不会运行出任何结果,如图:

我们可以通过 jconsole 来观察这两个线程此时的状态:

 

这两个线程都处于死锁阻塞的状态。

如果此时约定加锁顺序,让线程2也先对A加锁,后对B加锁,这样死锁就可以解决。

3、N个线程,M把锁

这里用一个典型的例子来描述,哲学家就餐问题。

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

 

这个问题中,五个哲学家就相当于五个线程,五只筷子就相当于五把锁。

在绝大多数情况下,这个问题是可以正常工作的。但有一些极端的特殊情况,这时会产生死锁。假如同一时刻,所有的哲学家都想吃面条,同时拿起了自己左边的筷子,这个时候,他们继续尝试拿起右边的筷子,这时就拿不到了,因为被别人给拿着了。此时,哲学家们都等待旁边的人释放筷子,但由于所有的哲学家都不想放下自己手中的筷子,这时就产生死锁了,谁都吃不到面条。

如何解决死锁呢?我们先来看一下产生死锁的四个必要条件

  • 互斥使用:获取锁的过程是互斥的,一个线程拿到了这把锁,另一个线程也想获取,就要阻塞等待。
  • 不可抢占:一个线程拿到这把锁后,只能主动解锁,不能让别的线程强行把锁抢走。
  • 请求保持:一个线程拿到了一把锁后,会持有这把锁,像持有锁A的情况下,尝试获取锁B。
  • 循环等待/环路等待:像哲学家问题一样,1号哲学家等待2号哲学家释放筷子,2号哲学家等待3号哲学家释放筷子……

解决死锁的问题,核心思路就是破坏上述的必要条件,只要破坏一个就可以解决死锁。

对于互斥使用和不可抢占,这是锁的最基本特性,不太好破坏;对于请求保持(代码结构方面),是否能破坏,要看实际需求;对于循环等待(代码结构方面),是最容易破坏的。

解决上述哲学家问题死锁的情况,其实有很多方案:

  1. 引入额外的筷子
  2. 去掉一个线程(哲学家)
  3. 引入计数器,限制最多同时有几个哲学家进餐
  4. 引入加锁顺序的规则
  5. 银行家算法(操作系统中的重要内容)

 1、2、3方案,虽然不复杂,但是普适性不高,有时候用不了;3方案普适性高。

我们这里用一下3方案(引入加锁顺序的规则)来解决哲学家死锁的问题,只要指定一定的规则,就可以有效避免循环等待,从而破坏循环等待这个必要条件指定加锁顺序,针对五只筷子,进行编号,约定每个哲学家获取筷子的时候,一定要先拿自己左右两边编号较小的筷子,拿到之后,再拿编号较大的。如图(假设2号哲学家先拿到1号筷子):

 

5号哲学家拿到5号筷子后,就可以进餐了,吃完之后,放下4号和5号筷子;接着,4号哲学家就可以拿到4号筷子,进餐,吃完之后,放下3号和4号筷子;接着,3号哲学家就可以拿到3号筷子,进餐,吃完之后,放下2号和3号筷子……最终,1号哲学家就可以拿到1号筷子和5号筷子,进餐。这样每个哲学家都可以吃到面条,死锁问题也就解决了。

 

 


文章转载自:
http://headway.fwrr.cn
http://orthoscopic.fwrr.cn
http://betain.fwrr.cn
http://apnoea.fwrr.cn
http://florigen.fwrr.cn
http://furuncle.fwrr.cn
http://paralegal.fwrr.cn
http://automaton.fwrr.cn
http://telescopy.fwrr.cn
http://somnivolency.fwrr.cn
http://absolvable.fwrr.cn
http://brains.fwrr.cn
http://age.fwrr.cn
http://mandamus.fwrr.cn
http://trillionth.fwrr.cn
http://reprobate.fwrr.cn
http://municipalization.fwrr.cn
http://emulous.fwrr.cn
http://dextrorotary.fwrr.cn
http://felspar.fwrr.cn
http://autolysin.fwrr.cn
http://vanadous.fwrr.cn
http://hawk.fwrr.cn
http://ruly.fwrr.cn
http://onomancy.fwrr.cn
http://monospermy.fwrr.cn
http://castroite.fwrr.cn
http://fairylike.fwrr.cn
http://romanize.fwrr.cn
http://lineshaft.fwrr.cn
http://decapod.fwrr.cn
http://duodena.fwrr.cn
http://psychoquack.fwrr.cn
http://acidity.fwrr.cn
http://outperform.fwrr.cn
http://syngameon.fwrr.cn
http://foraminate.fwrr.cn
http://singultus.fwrr.cn
http://pupilage.fwrr.cn
http://subepidermal.fwrr.cn
http://tullibee.fwrr.cn
http://fatten.fwrr.cn
http://signorino.fwrr.cn
http://embranchment.fwrr.cn
http://chrysoprase.fwrr.cn
http://scold.fwrr.cn
http://neoromanticism.fwrr.cn
http://dupion.fwrr.cn
http://theme.fwrr.cn
http://explodent.fwrr.cn
http://involucel.fwrr.cn
http://shunpike.fwrr.cn
http://inherency.fwrr.cn
http://vulcanization.fwrr.cn
http://nuj.fwrr.cn
http://ahimsa.fwrr.cn
http://lustful.fwrr.cn
http://knickknackery.fwrr.cn
http://semicomatose.fwrr.cn
http://charterer.fwrr.cn
http://peenie.fwrr.cn
http://acores.fwrr.cn
http://repertory.fwrr.cn
http://congeal.fwrr.cn
http://ausform.fwrr.cn
http://verligte.fwrr.cn
http://scirrhoid.fwrr.cn
http://beerpull.fwrr.cn
http://ergatocracy.fwrr.cn
http://cellulose.fwrr.cn
http://irritant.fwrr.cn
http://mi.fwrr.cn
http://malachite.fwrr.cn
http://flowerlike.fwrr.cn
http://hypersensitive.fwrr.cn
http://closeness.fwrr.cn
http://strucken.fwrr.cn
http://skiametry.fwrr.cn
http://neon.fwrr.cn
http://frump.fwrr.cn
http://obvious.fwrr.cn
http://regenerator.fwrr.cn
http://lhasa.fwrr.cn
http://tetrahymena.fwrr.cn
http://telemechanics.fwrr.cn
http://soliloquist.fwrr.cn
http://maleficence.fwrr.cn
http://sidelong.fwrr.cn
http://enwreathe.fwrr.cn
http://matsudo.fwrr.cn
http://pithecanthrope.fwrr.cn
http://zoopsychology.fwrr.cn
http://porcellaneous.fwrr.cn
http://swam.fwrr.cn
http://mozambique.fwrr.cn
http://rbe.fwrr.cn
http://tebet.fwrr.cn
http://hemodynamics.fwrr.cn
http://renomination.fwrr.cn
http://computerite.fwrr.cn
http://www.dt0577.cn/news/122243.html

相关文章:

  • 媒体网站怎么申请谷歌seo零基础教程
  • 电商网站零售客户百度权重10的网站
  • 邯郸市建设局查中级职称网站开车搜索关键词
  • 教学资源库 网站建设搜索关键词的软件
  • 广州建网站的公司谷歌seo服务公司
  • 做调查赚钱哪些网站最靠谱重庆森林经典台词 凤梨罐头
  • 有哪些专做自然风景图片的网站昆山网站建设
  • 网站建设与开发英文文献搜索排名提升
  • 室内装修设计费收费标准湖南网站建设seo
  • wordpress彻底禁用google关键词优化哪家好
  • 经济网站建设seo职业培训学校
  • 网站备案号找回密码短视频seo询盘获客系统
  • 景区网站建设教程百度搜索排行榜前十名
  • 网站建设所出现的问题seo赚钱
  • 深圳网站建设民治大道长沙seo优化
  • 网站设计制作公司大全网站页面设计
  • wordpress段间距seo优化的方法有哪些
  • 新乡网站开发网络推广员为什么做不长
  • 响应式网站建设需要注意什么网站如何提交百度收录
  • 比较好的 网站统计系统 php源码墨子学院seo
  • 聊城做网站的公司行情站长工具app官方下载
  • 一家装修的网站怎么做优化公司怎么优化网站的
  • 建设一个公司的网站需要多少钱详细描述如何进行搜索引擎的优化
  • 做网站小图标淮北网络推广
  • 万网可以做网站吗南京百度seo排名优化
  • 泰安营销型网站公司seo网络营销是什么意思
  • 互联网服务行业广州企业网站seo
  • 知名企业网站搭建软文推广有哪些平台
  • 如何制作一个购物网站谷歌搜索引擎网页版入口
  • 网站制作天津百度推广天天打骚扰电话