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

网站推广软件价格/谷歌seo和百度seo区别

网站推广软件价格,谷歌seo和百度seo区别,java做网站书,网站首页设计说明先来看一个例子一个卖面的面馆,有一个做面的厨师和一个吃面的食客,需要保证,厨师做一碗面,食客吃一碗面,不能一次性多做几碗面,更不能没有面的时候吃面;按照上述操作,进行十轮做面吃…

先来看一个例子

一个卖面的面馆,有一个做面的厨师和一个吃面的食客,需要保证,厨师做一碗面,食客吃一碗面,不能一次性多做几碗面,更不能没有面的时候吃面;按照上述操作,进行十轮做面吃面的操作。

用代码说话

首先我们需要有一个资源类,里面包含面的数量,做面操作,吃面操作;

当面的数量为0时,厨师才做面,做完面,需要唤醒等待的食客,否则厨师需要等待食客吃完面才能做面;

当面的数量不为0时,食客才能吃面,吃完面需要唤醒正在等待的厨师,否则食客需要等待厨师做完面才能吃面;

然后在主类中,我们创建一个厨师线程进行10次做面,一个食客线程进行10次吃面;

代码如下:

package com.duoxiancheng.code;

/**

* @user: code随笔

*/

class Noodles{

//面的数量

private int num = 0;

//做面方法

public synchronized void makeNoodles() throws InterruptedException {

//如果面的数量不为0,则等待食客吃完面再做面

if(num != 0){

this.wait();

}

num++;

System.out.println(Thread.currentThread().getName()+"做好了一份面,当前有"+num+"份面");

//面做好后,唤醒食客来吃

this.notifyAll();

}

//吃面方法

public synchronized void eatNoodles() throws InterruptedException {

//如果面的数量为0,则等待厨师做完面再吃面

if(num == 0){

this.wait();

}

num--;

System.out.println(Thread.currentThread().getName()+"吃了一份面,当前有"+num+"份面");

//吃完则唤醒厨师来做面

this.notifyAll();

}

}

public class Test {

public static void main(String[] args) {

Noodles noodles = new Noodles();

new Thread(new Runnable(){

@Override

public void run() {

try {

for (int i = 0; i < 10 ; i++) {

noodles.makeNoodles();

}

} catch (InterruptedException e) {

e.printStackTrace();

}

}

},"厨师A").start();

new Thread(new Runnable(){

@Override

public void run() {

try {

for (int i = 0; i < 10 ; i++) {

noodles.eatNoodles();

}

} catch (InterruptedException e) {

e.printStackTrace();

}

}

},"食客甲").start();

}

}

输出如下:

0533dcc499b16e748e6eb5f55713d493.png

可以见到是交替输出的;

如果有两个厨师,两个食客,都进行10次循环呢?

Noodles类的代码不用动,在主类中多创建两个线程即可,主类代码如下:

public class Test {

public static void main(String[] args) {

Noodles noodles = new Noodles();

new Thread(new Runnable(){

@Override

public void run() {

try {

for (int i = 0; i < 10 ; i++) {

noodles.makeNoodles();

}

} catch (InterruptedException e) {

e.printStackTrace();

}

}

},"厨师A").start();

new Thread(new Runnable(){

@Override

public void run() {

try {

for (int i = 0; i < 10 ; i++) {

noodles.makeNoodles();

}

} catch (InterruptedException e) {

e.printStackTrace();

}

}

},"厨师B").start();

new Thread(new Runnable(){

@Override

public void run() {

try {

for (int i = 0; i < 10 ; i++) {

noodles.eatNoodles();

}

} catch (InterruptedException e) {

e.printStackTrace();

}

}

},"食客甲").start();

new Thread(new Runnable(){

@Override

public void run() {

try {

for (int i = 0; i < 10 ; i++) {

noodles.eatNoodles();

}

} catch (InterruptedException e) {

e.printStackTrace();

}

}

},"食客乙").start();

}

}

此时输出如下:

a745c53a80a70631511e526d9a59d3b5.png

虚假唤醒

上面的问题就是"虚假唤醒"。

当我们只有一个厨师一个食客时,只能是厨师做面或者食客吃面,并没有其他情况;

但是当有两个厨师,两个食客时,就会出现下面的问题:

初始状态

8eedd90c8cc2c7a527ad1c9b8b115ac8.png

厨师A得到操作权,发现面的数量为0,可以做面,面的份数+1,然后唤醒所有线程;

f82c86cd94631a4d1de6b68d90125452.png

厨师B得到操作权,发现面的数量为1,不可以做面,执行wait操作;

f361bf4f0ab3f4fec7331f893e49663d.png

厨师A得到操作权,发现面的数量为1,不可以做面,执行wait操作;

69a24c3cbeba80e646e814b38e1c7bae.png

食客甲得到操作权,发现面的数量为1,可以吃面,吃完面后面的数量-1,并唤醒所有线程;

621a4cc05158f93772df05c02c183c41.png

6. 此时厨师A得到操作权了,因为是从刚才阻塞的地方继续运行,就不用再判断面的数量是否为0了,所以直接面的数量+1,并唤醒其他线程;

4056793b146b12aafeadf6943c103c71.png

7. 此时厨师B得到操作权了,因为是从刚才阻塞的地方继续运行,就不用再判断面的数量是否为0了,所以直接面的数量+1,并唤醒其他线程;

03bc084732bf268c7c36a2bfbe7242f0.png

这便是虚假唤醒,还有其他的情况,读者可以尝试画画图分析分析。

解决方法

出现虚假唤醒的原因是从阻塞态到就绪态再到运行态没有进行判断,我们只需要让其每次得到操作权时都进行判断就可以了;

所以将

if(num != 0){

this.wait();

}

改为

while(num != 0){

this.wait();

}

if(num == 0){

this.wait();

}

改为

while(num == 0){

this.wait();

}

即可。

微信搜索:code随笔 欢迎关注乐于输出Java,算法等干货的技术公众号。

http://www.lbrq.cn/news/836407.html

相关文章:

  • ps做网站logo尺寸/搜索引擎优化的目的是对用户友好
  • 怎么做电脑端网站设计稿/nba赛程排名
  • 建网站是什么技术/河南省疫情最新情况
  • 长沙手机网站建设哪些内容/百度seo优
  • 自建服务器做网站/seo优化一般包括哪些内容()
  • 小程序diy制作平台/网站seo快速优化技巧
  • 惠州专业做网站公司/重庆优化seo
  • 武汉做网站seo/免费发布广告
  • 咸宁网站开发/seo黑帽培训骗局
  • 网站首页备案号链接/谷歌外贸平台推广需要多少钱
  • 河南疫情防控最新消息/太原百度快照优化排名
  • 2013年以前pc网站建设/网络推广优化seo
  • 怎么把wordpress/衡水seo优化
  • 湖南 政府网站信息内容建设/百度推广优化师
  • 网站用什么做备份/百度推广获客
  • dedecms 5.7 通用企业网站模板/企业seo案例
  • 建设银行网站怎样查询贷款信息查询/网络推广项目代理
  • 作品集怎么做网页/seo建站公司推荐
  • 眼睛网站开发/国内搜索引擎排名2022
  • 婚纱摄影的网站怎么做/网络广告是什么
  • 中国建设银行网站-个人客户/如何制作网页
  • 校友会网站建设/seo管理
  • 缤纷网站免费做服装/seo外链怎么做能看到效果
  • 石家庄网站公司/小辉seo
  • 软件开发公司怎么找客户/seo优化的网站
  • b2b网站建设报价/提高工作效率英语
  • 网站开发保密协议模板/纯注册app拉新平台
  • 赣州建网站/seo诊断工具有哪些
  • 深圳注册公司育君财税/高级seo
  • 上线了做网站怎么样/搜索引擎排名优化方案
  • display:flex弹性布局
  • OCR 赋能档案数字化:让沉睡的档案 “活” 起来
  • UDP和TCP的主要区别是什么?
  • 系统性学习C语言-第十八讲-C语言内存函数
  • Fluent许可问题常见解答
  • JavaScript进阶篇——第五章 对象成员管理与数组遍历优化