GVKun编程网logo

为什么即使修改了锁变量,我也会得到一个无限的while循环?

14

本文将介绍为什么即使修改了锁变量,我也会得到一个无限的while循环?的详细情况,。我们将通过案例分析、数据研究等多种方式,帮助您更全面地了解这个主题,同时也将涉及一些关于C#–while循环中的fo

本文将介绍为什么即使修改了锁变量,我也会得到一个无限的while循环?的详细情况,。我们将通过案例分析、数据研究等多种方式,帮助您更全面地了解这个主题,同时也将涉及一些关于C# – while循环中的foreach循环 – 打破foreach并立即继续while循环?、java – 为什么有人会像这样构造一个while循环?、java_for循环+do-while循环和while循环、switch、java中while循环和do while循环有什么区别的知识。

本文目录一览:

为什么即使修改了锁变量,我也会得到一个无限的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循环?

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循环中.

对不起,我没有意识到我曾两次使用“某事”这个词.

解决方法

如果我理解正确,您可以在此处使用LINQ Any/ All谓词:
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循环?

java – 为什么有人会像这样构造一个while循环?

我正在读一本关于 Java的书,我们正在从一个频道读到一个ByteBuffer.我找到了作者构造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

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循环有什么区别

java 中 while 和 do-while 循环的区别:while 循环先检查条件再执行循环体,而 do-while 循环先执行一次循环体再检查条件。while 循环在条件满足时才执行循环体,而 do-while 循环至少执行一次循环体。

java中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循环有什么区别的相关信息,可以在本站进行搜索。

本文标签: