`
wx1568847608
  • 浏览: 14427 次
文章分类
社区版块
存档分类
最新评论

一个输出语句引起的线程问题思考

 
阅读更多

 

1、问题抛出:

这是一个网友在写线程代码时无意间发现的一个问题,线程不能正常停止。

那为什么输出语句在while里和外会影响到线程的正常停止呢?

 

2、问题猜想:

当我看到这个问题的时候,首先想到的是多线程内存可见性引起的问题。为了证明我的猜想,将stop变量声明为volatile(用来确保将变量的更新操作通知到其他线程,保证了新值能立即同步到主内存,以及每次使用前立即从主内存刷新)。于是线程正常终止了。

3、继续猜想:

为什么加上输出也能正常终止呢? 难道是因为输出引起了cpu缓存的刷新操作?

于是我打开 System.out.println()的源码,果然在println方法上面有一个同步关键字。

20100202_ntwR.jpg
那么问题就已明显,正是因为同步关键字引起的cpu缓存同步主内存。

synchronized 用于确保写线程更新变量后,读线程再访问该 变量时可以读取到该变量最新的值。

 

4、总结:

1、java层面

在CPU结构上就是load buffer和store buffer在进入同步块的时候会被刷到缓存。

在boolean stop关键字上加volatile和使用PrintWriter.pringln中同步块的原理是一样的,区别在于两种方式的差异。

同步块是通过对象内置锁来通信,就是说不到同步块收不到并发信息

而volatile通过lock关键字,只要通过读写都能收到

2、cpu层面

加入一个循环变量被放到寄存器里面了,并且构造了一个高速死循环,你从另一个线程里面去改变一个内存里面的值,确实不会影响到这个寄存器里面的变量
 

比如一个变量名字为a,这个a刚开始存储在内存里面
但是作为一个循环判断变量的时候,很可能就被编译器优化一下放到CPU里面的寄存器内部了

而CPU现在是多个核心的
一个核心基于寄存器里面的值去做死循环,另一个核心如果不是刻意通过什么指令去找到这个核心的寄存器操作,估计是没办法打断它了

 

5、说明

才疏学浅,如有误解,欢迎打脸,哈!

 

 

转载于:https://my.oschina.net/yangshj/blog/734464

分享到:
评论

相关推荐

    输入语句、输出语句和赋值语句.ppt

    同时,一个赋值语句只能给一个变量赋值,不能像`R = r = 9`那样同时给两个变量赋值。如果需要连续给同一个变量赋不同的值,最后赋的值将覆盖之前的值。 在输入和输出语句中,要注意以下几点: 1. 输入语句的“提示...

    输入输出流及线程资料

    2. 线程安全:当多个线程同时访问同一个输入输出流时,需要考虑线程安全问题,防止数据错乱或丢失。 3. 异常处理:合理使用异常处理机制,如`try-catch-finally`,确保在出现异常时能够正常恢复或清理资源。 4. ...

    java输入输出语句整理总结.doc

    Java 输入输出语句整理总结 Java 输入输出语句是 Java 编程语言中最基本也是最重要的部分之一。输入输出语句是指程序与外部世界交互的桥梁,通过输入输出语句,程序可以从外部世界获取数据,并将处理结果输出到外部...

    pascal-带格式的输出语句及输入语句.pdf

    例如,使用reset过程来打开一个已存在的文件进行读取操作,或者使用rewrite过程来创建并打开一个新文件用于写入数据。 其次,文件的输入与输出语句是Pascal语言中用于数据交互的基本工具。输出语句write和 writeln...

    基本算法语句--赋值、输入、输出语句.doc

    通过实际例子,如让学生编写一个简单的程序,获取用户的成绩并计算平均分,可以直观地展示这些语句的实际应用,让学生更好地理解它们在解决问题中的作用。 **例题解析**: 例题1中,`PRINT "3+5=";3+5` 这个语句会...

    基本算法语句之输入输出赋值语句.ppt

    "基本算法语句之输入输出赋值语句" 本节内容主要讲述基本算法语句中的输入输出赋值语句,包括输入语句、输出语句和赋值语句。 一、输入语句 输入语句的作用是实现算法的输入信息功能。其一般格式为:INPUT “提示...

    2020_2021学年高中数学课时分层作业5输入语句输出语句和赋值语句新人教A版必修3

    **赋值语句**是编程中最基础的操作之一,它将一个值分配给一个变量。在高中数学课程中,学生会学习到赋值语句的基本结构,比如`x = 5`,意味着将数值5赋予变量x。赋值语句不仅用于设置初始值,还可以改变变量的当前...

    C#线程安全和跨线程问题

    1. 锁(Lock):C#中的锁语句(lock)提供了一种同步原语,确保同一时间只有一个线程可以执行特定代码块。例如: ```csharp lock (obj) { // 访问共享资源的代码 } ``` 这里的`obj`是一个对象引用,用于标识锁。...

    数学 输入语句 输出语句和赋值语句新人教A必修PPT学习教案.pptx

    - 求函数值的算法:例如求`y = x^3 + 3x^2 - 24x + 30`的值,需要一个输入语句获取`x`的值,然后通过赋值语句计算`y`,最后用输出语句显示`y`的值。 - 计算平均成绩的算法:输入三门课程的成绩,通过赋值语句计算...

    输入输出语句和赋值语句教学设计说明.doc

    4. **总结与反思**:回顾本节课所学内容,强调输入、输出和赋值语句的重要性,并引导学生思考如何将所学知识应用于实际问题的解决中。 通过本节的教学设计,旨在让学生掌握基本的程序语句,理解程序语言与算法的...

    易语言判断多线程是否运行结束

    标题“易语言判断多线程是否运行结束”所指的,就是在多线程环境下,编写代码来检测一个特定线程是否已经完成了它的执行任务,即线程是否已经终止。这在等待所有线程完成、线程间同步或者资源释放等场景下非常有用。...

    嵌入式Linux下C程序设计--02输入输出语句.ppt

    putchar 函数的作用是向终端输出一个字符,例如 putchar(c) ;它输出字符变量 c 的值。getchar 函数的作用是从终端(或系统隐含指定的输入设备)输入一个字符。例如,c = getchar() ;函数的值就是从输入设备得到的...

    输入、输出语句和赋值语句教学设计.doc

    《输入、输出语句和赋值语句教学设计》 在计算机科学领域,输入、输出语句和赋值语句是编程基础的重要组成部分,它们构成了程序执行的基本逻辑。本文主要探讨这些概念,旨在帮助学生理解和掌握如何运用它们来编写...

    2019_2020学年高中数学第一章算法初步1.2.1输入语句输出语句和赋值语句课件新人教A版必修3

    - 一次只能给一个变量赋值。 通过这些基础知识,学生应该能够编写简单的程序,理解并运用这三种基本的算法语句。在实际练习中,要注意输入语句的正确格式,避免直接对表达式进行输入,以及在输出语句中避免尝试...

    2020学年高中数学 1.2.1输入语句、输出语句和赋值语句素材 新人教A版必修3.doc

    通过以上内容,学生不仅可以掌握输入、输出和赋值语句的基本用法,还能了解它们在算法设计中的作用,以及如何将这些语句应用于实际问题的解决中。结合实际编程练习,能有效提升学生的编程素养和问题解决能力。

    3Pascal语言输入语句、输出语句的应用[参考].pdf

    `readln`语句要求用户输入一个回车键来确认输入结束。值得注意的是,`read`语句在遇到额外的数据时,可以继续读取,而`readln`则不会,因此在实际编程中,通常推荐使用`readln`以避免多余数据的影响。 输出语句则是...

    c# 多线程任务中结束全部线程

    `语句创建了一个新的线程,并将`threadstart`方法设置为线程的入口点。`t.Start();`则启动了这个线程,使其开始执行`threadstart`方法内的代码。 ### 使用委托进行跨线程调用 由于GUI线程(即主UI线程)不允许从...

    log4j打印到控制台输出sql语句

    log4j错误打印到控制台 并且输出sql语句

    简单的print输出语句

    用print简单输出一定格式的语句,如空心三角形、实心三角形

    解决python线程卡死的问题

    本节将通过一个具体的案例来分析服务端进程数量不足导致客户端进程卡死的问题。在这个案例中,服务端运行了一个基于`Thrift`的服务,并设置了服务进程的数量;客户端则使用多进程的方式调用该服务。 - **服务端代码...

Global site tag (gtag.js) - Google Analytics