这只是我的个人观点,如有错误,希望你可以指出。

首先英文原版

中文译版

我觉得“不需要”还会让人产生误解,应该译为不一定要。

很多时候会被断章取义地理解,我们一定要有“不一定”,“可能”的意识,下面给出一段代码演示,亲测。

    static boolean close=false;

    public static void main(String[] args) throws InterruptedException {
new Thread(()->{ //且称线程1
int count=1;
while(!close){
Thread.yield(); //sleep()有同样的效果
count++;
}
System.out.println("yield"+count);//等待io
}).start(); Thread.sleep(100);
close=true;
} //yield77616,这个数在70000-110000左右

线程是会停止的,这时候断章取义者就会百思不得其解。

那么jsr中的又是什么意思呢?

是基于这样的一个假设的:

主线程在cpu0上运行。

线程1一直在cpu1上运行,虽然线程1 yield,但是没有别的线程来使用cpu1,意思为cpu1中寄存器,缓存中存着的还是线程1的数据,如变量close。

然而,如果在线程1 yield或者sleep的时候,操作系统调度别的线程来使用cpu1,那么cpu1中存放的旧数据将会刷回主存(实际刷回时机视实际情况,不同的cpu应该会有不同的策略),然后存放别的线程所需的数据。那么等到线程1 yield或者sleep完毕,到它使用cpu1(不一定是cpu1)的时候,发现没有命中缓存,就会从主存中把变量close读取进来,而这个时候主存当中的close已经被主线程修改为true了,因此循环结束。

而实际情况是,时时刻刻都有大量的线程在工作,你放弃了就会有别人来用。

所以它真正强调的意思是“不主动”,而像volatile就会主动去做某些措施。

继续补充

static boolean close=false;

    public static void main(String[] args) throws InterruptedException {
new Thread(()->{
//int count=1;
while(!close){
System.out.println("io操作");
}
System.out.println("io操作完毕");
}).start(); Thread.sleep(100);
close=true;
}
// io操作
// io操作
// .
// .
// .
// io操作
// io操作完毕

如上,线程1在进行IO操作的时候,将会有别的线程来使用cpu1,线程1照样结束循环。

只有这样才不会结束

while(!close){
}

总结

一言以蔽之,只要cpu没有命中缓存,就会从主存中读取。

再补充

可能会觉得,那这样的话,yield和sleep就像是普通的正常的操作(反正肯定会有别的线程来使用cpu)啊,有必要这样强调吗?

我觉得

一是文档的规范性,完整性。

二,也是曾在“为什么java的称为虚拟机,而python的称为解释器”这样的问题中,看到的一个答案。(不保证正确)

jvm是模仿着硬件去设计的,像一些操作,取操作码,取操作数,push,store等指令。如果按照jvm去配置硬件,有可能做到cpu中就只有jvm的线程在跑,或者说通俗点说jvm就是操作系统。那这样的话,就真的满足之前的假设了——“线程1一直在cpu1上运行,虽然线程1 yield,但是没有别的线程来使用cpu1”。

细读jsr中的yield语义,或者不是我们想象中的那样的更多相关文章

  1. Python3中的yield from语法

    Python3中的yield from语法 by Kay Zheng Tags: python, 协程, generator 30 March 2014 2016-2-23 更新 這篇文章是兩年前寫的 ...

  2. 可惜Java中没有yield return

    项目中一个消息推送需求,推送的用户数几百万,用户清单很简单就是一个txt文件,是由hadoop计算出来的.格式大概如下: uid caller 123456 12345678901 789101 12 ...

  3. 初次使用C#中的yield

    这几天在Python程序员的微信订阅号中总是见到yield的关键字,才想起来在C#中也是有yield,但是只是知道有,从来没有了解过他的用法,今天有时间就来看看是怎么使用的.刚开始肯定就是搜索一下用法 ...

  4. C#中的yield return与Unity中的Coroutine(协程)(上)

    C#中的yield return C#语法中有个特别的关键字yield, 它是干什么用的呢? 来看看专业的解释: yield 是在迭代器块中用于向枚举数对象提供值或发出迭代结束信号.它的形式为下列之一 ...

  5. 关于Python中的yield

    关于Python中的yield   在介绍yield前有必要先说明下Python中的迭代器(iterator)和生成器(constructor). 一.迭代器(iterator) 在Python中,f ...

  6. 关于Python中的yield(转载)

    您可能听说过,带有 yield 的函数在 Python 中被称之为 generator(生成器),何谓 generator ? 我们先抛开 generator,以一个常见的编程题目来展示 yield ...

  7. C#中的yield return用法演示源码

    下边代码段是关于C#中的yield return用法演示的代码. using System;using System.Collections;using System.Collections.Gene ...

  8. python 中的 yield 究竟为何物?生成器和迭代器的区别?

    当你突然看到别人的代码中出现了一个好像见过但又没用过的关键词 比如 yield ,你是否会觉得这段代码真是高大上呢? 或许只有我这种小白才会这样子觉得,就在刚刚,我就看见了别人的代码中的yield,觉 ...

  9. Python中的yield生成器的简单介绍

    Python yield 使用浅析(整理自:廖 雪峰, 软件工程师, HP 2012 年 11 月 22 日 ) 初学 Python 的开发者经常会发现很多 Python 函数中用到了 yield 关 ...

随机推荐

  1. Python自带HTTP文件传输服务

    一行命令搭建一个基于python的http文件传输服务 由于今天朋友想要一个文件,而我恰好有,因为这个文件比较大,网速不是很给力,所以想到了python自己有这么一个功能,这样不仅不需要下载其他软件, ...

  2. Python Global和Nonlocal的用法

    nonlocal 和 global 也很容易混淆.简单记录下自己的理解. 解释 global 总之一句话,作用域是全局的,就是会修改这个变量对应地址的值. global 语句是一个声明,它适用于整个当 ...

  3. Spring中bean的实例化过程

    1.从缓存中.优先从一级缓存中拿,有则返回. 如果没有,则从二级缓存中获取,有则返回. 如果二级缓存中拿不到,则从三级缓存中拿,能拿到,则从三级缓存中删除,移到二级缓存. 如果三级缓存也没有,则返回n ...

  4. flask模板 flask-bootstrap

    1.模板 a.block块中继承前面block块的内容,需要添加{{super()}} b.macro 宏:   作用:在模板中定义函数(定义函数->注意添加()->可以使用from 模板 ...

  5. Kafka -入门学习

    kafka 1. 介绍 官网 http://kafka.apache.org/ 介绍 http://kafka.apache.org/intro 2. 快速开始 1. 安装 路径: http://ka ...

  6. 数据库中事务的ACID特性

    数据库中事务的ACID特性 前言前面我们介绍过数据库中 带你了解数据库中JOIN的用法 与 带你了解数据库中group by的用法 的相关用法.本章节主要来介绍下数据库中一个非常重要的知识点事务,也是 ...

  7. laravel 操作多数据库总结

    laravel 操作多数据库总结 读写分离 env配置 DB_CONNECTION=mysql DB_HOST=xxxxxx DB_PORT=xxx DB_DATABASE=xx DB_USERNAM ...

  8. maven jar 包问题

    1. Failure to transfer... 这种错误基本是所需要的 jar 包不存在,或者下载不完整,可去本地仓库查看相关 jar 文件的完整性 解决方案: 删除对应 jar 包,重新下载(删 ...

  9. 详解隐马尔可夫模型(HMM)中的维特比算法

    笔记转载于GitHub项目:https://github.com/NLP-LOVE/Introduction-NLP 4. 隐马尔可夫模型与序列标注 第3章的n元语法模型从词语接续的流畅度出发,为全切 ...

  10. reload重载配置文件的真相

    02检查配置文件语法也就是说在重载nginx配置文件之前,不是必须使用nginx -t检查语法 03修改配置文件,新开启端口,比如443,所以需要打开新的监听端口 04使用新配置启动新的worker子 ...