本文将介绍为什么即使修改了锁变量,我也会得到一个无限的while循环?的详细情况,。我们将通过案例分析、数据研究等多种方式,帮助您更全面地了解这个主题,同时也将涉及一些关于C#–while循环中的fo
本文将介绍为什么即使修改了锁变量,我也会得到一个无限的while循环?的详细情况,。我们将通过案例分析、数据研究等多种方式,帮助您更全面地了解这个主题,同时也将涉及一些关于C# – while循环中的foreach循环 – 打破foreach并立即继续while循环?、java – 为什么有人会像这样构造一个while循环?、java_for循环+do-while循环和while循环、switch、java中while循环和do while循环有什么区别的知识。
本文目录一览:- 为什么即使修改了锁变量,我也会得到一个无限的while循环?
- C# – while循环中的foreach循环 – 打破foreach并立即继续while循环?
- java – 为什么有人会像这样构造一个while循环?
- java_for循环+do-while循环和while循环、switch
- java中while循环和do while循环有什么区别
为什么即使修改了锁变量,我也会得到一个无限的while循环?
public class GuardedBlock {
private boolean guard = false; private static void threadMessage(String message) { System.out.println(Thread.currentThread().getName() + ": " + message); } public static void main(String[] args) { GuardedBlock guardedBlock = new GuardedBlock(); Thread thread1 = new Thread(new Runnable() { @Override public void run() { try { Thread.sleep(1000); guardedBlock.guard = true; threadMessage("Set guard=true"); } catch (InterruptedException e) { e.printStackTrace(); } } }); Thread thread2 = new Thread(new Runnable() { @Override public void run() { threadMessage("Start waiting"); while (!guardedBlock.guard) { //threadMessage("Still waiting..."); } threadMessage("Finally!"); } }); thread1.start(); thread2.start(); }}
我正在通过Java Essentials教程学习并发性。找到了守卫的方块并尝试对其进行测试。我无法理解的一件事。
虽然循环是无限的,但是如果您取消注释threadMessage行,则一切正常。为什么?
答案1
小编典典简短答案
您忘了声明guard
为易失性布尔值。
如果您将字段声明省略为volatile
,则不会告诉JVM该字段可以被多线程看到,例如您的示例。
在这种情况下,的值guard
将被读取一次,并且将导致无限循环。它将针对以下内容进行优化(无打印):
if(!guard){ while(true) { }}
现在为什么要System.out.println
改变这种行为?因为writes
是同步的,这迫使线程不缓存读取。
这里粘贴了println
一种PrintStream
使用的方法的代码System.out.println
:
public void println(String x) { synchronized (this) { print(x); newLine(); }}
和write
方法:
private void write(String s) { try { synchronized (this) { ensureOpen(); textOut.write(s); textOut.flushBuffer(); charOut.flushBuffer(); if (autoFlush && (s.indexOf(''\n'') >= 0)) out.flush(); } } catch (InterruptedIOException x) { Thread.currentThread().interrupt(); } catch (IOException x) { trouble = true; }}
注意同步。
C# – while循环中的foreach循环 – 打破foreach并立即继续while循环?
while (foo() == true) { foreach (var x in xs) { if (bar(x) == true) { //"break;" out of this foreach //AND "continue;" on the while loop. } } //If I didn't continue,do other stuff. }
我有点坚持如何做到这一点.
更新:我修正了问题.我遗漏了一个事实,即如果我不打电话给继续,我需要处理其他事情;在while循环中.
对不起,我没有意识到我曾两次使用“某事”这个词.
解决方法
while (something) { // You can also write this with the Enumerable.All method if(!xs.Any(x => somePredicate(x)) { // Place code meant for the "If I didn't continue,do other stuff." // block here. } }
java – 为什么有人会像这样构造一个while循环?
try (FileChannel inCh = (FileChannel) Files.newByteChannel(file)) { ByteBuffer lengthBuf = ByteBuffer.allocate(8); int strLength = 0; ByteBuffer[] buffers = { null,ByteBuffer.allocate(8) }; while(true) { if(inCh.read(lengthBuf) == -1) break; lengthBuf.flip(); strLength = (int)lengthBuf.getDouble(); buffers[0] = ByteBuffer.allocate(2*strLength); if(inCh.read(buffers) == -1) { System.err.println("EOF found reading ht eprime string."); break; } System.out.printf("String length: %3s String: %-12s Binary Value: %3d%n",strLength,((ByteBuffer) (buffers[0].flip())).asCharBuffer().toString(),((ByteBuffer)buffers[1].flip()).getLong()); lengthBuf.clear(); buffers[1].clear(); } System.out.println("\nEOF reached."); } catch (IOException e) {
我试过这样的:
while(inCh.read(lengthBuf) != -1) {
它的工作方式相同.是否有一个实际或代码清晰的原因,作者会像他一样写出来?
解决方法
请注意,在while循环的下方还有第二个条件会突破循环.我怀疑这是推动作者使用的原因(真实).
通过将其写为while(true),您可以提醒读者,内部必须有一个或多个断点.读者将不得不在循环内部查看休息时间,并希望能够找到它们.
写你的方式,随意的读者可能会扫描代码的顶部,并假设while条件是循环终止的唯一方法.
要考虑的另一点是对称性或平衡性.正如原作者所写,循环终止都是相同的形式.即从循环内打破.你的版本感觉不对称. while测试中的一个终止点,以及循环内的不同性质的另一个终止点.
java_for循环+do-while循环和while循环、switch
do-while 循环
- do-while循环
- do-while和while区别
- for循环(break,continue)的区别
- switch选择语句
do-while 基础语法
do{
//循环语句
}while(条件判断);
do-while和while区别
int sum = 0;
while(sum > 0){
System.out.println("while输出了一把铁剑");
}
//条件不满足 不输出
do{
System.out.println("do-while 老大哥 输出了一把无尽");
}while(sum > 0);
// 哎 错了也输出一次
输出结果: do-while 老大哥 输出了一把无尽
总结:do while 和 while 区别是 do-while循环是不管条件对错先执行一次循环体
如果循环中的语句必须执行一次,建议使用do
-while
for循环基本语法
for(数据类型 数据名 = 值;值 逻辑判断 值;++或者-- ){
// 语句
}
for (int i = 0; i < 100; i++) {
System.out.println(i);
}
break,continue的区别
break:跳出当前循环
continue:跳过当前循环
// continue
for (int i = 1; i <= 10; i++) {
if (i == 5){
continue;
}
System.out.println(i);
}
/*输出结果
1
2
3
5
* */
// break
for (int i = 1; i <= 10; i++) {
if (i == 5){
break;
}
System.out.println(i);
}
/*输出结果
1
2
* */
switch判断语句语法
// 语法为
switch(){
case value:
// 语句
break;
case value:
// 语句
break;
case value:
// 语句
break;
default:
// 语句
break;
}
实践
char English_alphabet = ''A''; // 英文字母
switch(English_alphabet){
case ''A'':
System.out.println("优秀如你");
break;
case ''B'':
System.out.println("有进步空间");
break;
case ''C'':
System.out.println("还需努力");
break;
default:
System.out.println("未知的等级");
}
java中while循环和do while循环有什么区别
java 中 while 和 do-while 循环的区别:while 循环先检查条件再执行循环体,而 do-while 循环先执行一次循环体再检查条件。while 循环在条件满足时才执行循环体,而 do-while 循环至少执行一次循环体。
Java 中 while 循环和 do-while 循环的区别
主要差异:
while 循环在检查循环条件之前会首先执行循环体,而 do-while 循环则在检查循环条件之前先执行循环体一次。
详细说明:
立即学习“Java免费学习笔记(深入)”;
-
while 循环:
- 语法:while (condition) { ... }
- 在执行循环体之前先检查条件。
- 如果条件为 false,则立即退出循环。
- 如果条件为 true,则执行循环体。
-
do-while 循环:
- 语法:do { ... } while (condition);
- 在检查条件之前先执行循环体一次。
- 然后,检查条件。
- 如果条件为 true,则继续执行循环体。
- 如果条件为 false,则退出循环。
何时使用:
- while 循环:当需要在执行循环体之前检查条件时。例如,当你需要从用户那里重复获取输入,直到他们输入特定值。
- do-while 循环:当需要至少执行循环体一次时。例如,当你需要初始化一些值并希望在退出循环之前使用它们。
示例:
// while 循环 while (true) { // 循环体 if (condition) { // 退出循环 break; } } // do-while 循环 do { // 循环体 } while (condition);
以上就是java中while循环和do while循环有什么区别的详细内容,更多请关注php中文网其它相关文章!
我们今天的关于为什么即使修改了锁变量,我也会得到一个无限的while循环?的分享就到这里,谢谢您的阅读,如果想了解更多关于C# – while循环中的foreach循环 – 打破foreach并立即继续while循环?、java – 为什么有人会像这样构造一个while循环?、java_for循环+do-while循环和while循环、switch、java中while循环和do while循环有什么区别的相关信息,可以在本站进行搜索。
本文标签: