细读jsr中的yield语义,或者不是我们想象中的那样
这只是我的个人观点,如有错误,希望你可以指出。
首先英文原版

中文译版

我觉得“不需要”还会让人产生误解,应该译为不一定要。
很多时候会被断章取义地理解,我们一定要有“不一定”,“可能”的意识,下面给出一段代码演示,亲测。
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语义,或者不是我们想象中的那样的更多相关文章
- Python3中的yield from语法
Python3中的yield from语法 by Kay Zheng Tags: python, 协程, generator 30 March 2014 2016-2-23 更新 這篇文章是兩年前寫的 ...
- 可惜Java中没有yield return
项目中一个消息推送需求,推送的用户数几百万,用户清单很简单就是一个txt文件,是由hadoop计算出来的.格式大概如下: uid caller 123456 12345678901 789101 12 ...
- 初次使用C#中的yield
这几天在Python程序员的微信订阅号中总是见到yield的关键字,才想起来在C#中也是有yield,但是只是知道有,从来没有了解过他的用法,今天有时间就来看看是怎么使用的.刚开始肯定就是搜索一下用法 ...
- C#中的yield return与Unity中的Coroutine(协程)(上)
C#中的yield return C#语法中有个特别的关键字yield, 它是干什么用的呢? 来看看专业的解释: yield 是在迭代器块中用于向枚举数对象提供值或发出迭代结束信号.它的形式为下列之一 ...
- 关于Python中的yield
关于Python中的yield 在介绍yield前有必要先说明下Python中的迭代器(iterator)和生成器(constructor). 一.迭代器(iterator) 在Python中,f ...
- 关于Python中的yield(转载)
您可能听说过,带有 yield 的函数在 Python 中被称之为 generator(生成器),何谓 generator ? 我们先抛开 generator,以一个常见的编程题目来展示 yield ...
- C#中的yield return用法演示源码
下边代码段是关于C#中的yield return用法演示的代码. using System;using System.Collections;using System.Collections.Gene ...
- python 中的 yield 究竟为何物?生成器和迭代器的区别?
当你突然看到别人的代码中出现了一个好像见过但又没用过的关键词 比如 yield ,你是否会觉得这段代码真是高大上呢? 或许只有我这种小白才会这样子觉得,就在刚刚,我就看见了别人的代码中的yield,觉 ...
- Python中的yield生成器的简单介绍
Python yield 使用浅析(整理自:廖 雪峰, 软件工程师, HP 2012 年 11 月 22 日 ) 初学 Python 的开发者经常会发现很多 Python 函数中用到了 yield 关 ...
随机推荐
- 测试工具Fiddler(一)—— 基础知识
Fiddler基础知识 一.Fiddler是什么? Fiddler是一个http协议调试代理工具,它能够记录客户端和服务器之间的所有 HTTP请求,可以针对特定的HTTP请求,分析请求数据.设置断点. ...
- 想玩转JAVA高并发,这些概念你必须懂!
我们在找工作时,经常在招聘信息上看到有这么一条:有构建大型互联网服务及高并发等经验,你第一时间想到的是媒体常说的双十一吗?带着问题,我们一起思考技术…. 高并发高并发 它是互联网分布式系统架构设计中必 ...
- ORM基础2 字段及其参数和meta
一.ORM简介 1.概念:ORM(Object Relational Mappingt ),对象关系映射 2.实质:类与数据库之间的映射 3.优点: 开发人员不用写数据库 4.缺点: 开发人员,数据库 ...
- 5.JavaSE之数据类型详解
数据类型: 强类型语言: 要求变量的使用严格要求符合规定,写错了就不行,所有变量都必须先定义后才能使用,否则是不能使用的. 比如Java.C++都是强类型语言,也就是说,一旦定义了一个变量,只定义了某 ...
- 代码审计之CVE-2018-7600-Drupal远程代码执行漏洞-Render API
今天学习一下Drupal的另一个漏洞,由于渲染数组不当造成的漏洞 poc: url:http://localhost/drupal-8.5.0/user/register?element_parent ...
- python __init__()类构造方法
构造方法用于创建对象时使用,每当创建一个类的实例对象时,python解释器都会自动调用它. class Person: def __init__(self): print("调用构造方法&q ...
- URL各部分详解
就以下面这个URL为例,介绍下普通URL的各部分组成 http://www.aspxfans.com:8080/news/index.asp?boardID=5&ID=24618&pa ...
- vscode打开文件,中文显示乱码(已解决)
之前使用vscode打开keil的文件后,发现显示乱码,网上查找资料发现大多是这种方法:将files.autoGuessEncoding改为true,但是并没有用. 发现第二种方法为:在vscode中 ...
- C# LINQ查询表达式用法对应Lambda表达式
C#编程语言非常优美,我个人还是非常赞同的.特别是在学习一段时间C#后发现确实在它的语法和美观度来说确实要比其它编程语言强一些(也可能是由于VS编译器的加持)用起来非常舒服,而且对于C#我觉得他最优美 ...
- python基础面试集锦(51-100)
目录 51.把aaabbbcccdd这种形式的字符串压缩成a3b3c3d2的形式? 52.给你一个字符串'abc',打印出该字符串的所有排列组合? 53.执行以下代码后,x的值为? 54.对于一个非空 ...