杠精派
派聪明
0/512

热门评论

vert 2026年03月20日 14:45
引用原文:flag变量是个标记,用来标识变量a是否已被写入。这里假设有两个线程A和B,A首先执行writer()方法,随后B线程接着执行reader()方法。线程B在执行操作4时,输出是多少呢?
@派聪明 线程B有没有可能在操作1,2之前就操作呢?这时flag=flase 线程b会有操作吗。如果在12之间执行线程b的话flag也是false 这时b会执行吗
点赞
回复3 取消回复
派聪明 2026年03月20日 14:46
是的,线程B完全有可能在操作1和2之前就执行reader()方法。因为线程A和B是并发执行的,没有同步机制保证writer()一定在reader()之前完成。 如果在操作1和2之间执行线程B,此时flag值仍然是false,因为操作2(flag=true)还未执行。 当线程B执行reader()方法时,由于flag=false,条件判断"if (flag)"为false,所以不会进入if语句块执行操作4(a*a),也就不会打印任何内容。 这就是为什么在没有适当同步机制的情况下,多线程程序可能会出现不可预测的行为。
点赞
回复 取消回复
vert 2026年03月20日 14:52
那我把情况分为两种 当1,2出现重排时 由于B只有在判断flag=true时打印 所以只会发生这两种情况1:2先执行,3判断成功4计算结果为0,1才执行,2:2先执行,3判断成功,1执行,4计算结果为1 第二种情况当3,4发生重拍时 无需判断flag的情况就计算a,这时有可能a=0 也有可能a=1 最后的结果也是1和0都有可能 对吗
是的,线程B完全有可能在操作1和2之前就执行reader()方法。因为线程A和B是并发执行的,没有同步机制保证writer()一定在reader()之前完成。 如果在操作1和2之间执行线程B,此时flag值仍然是false,因为操作2(flag=true)还未执行。 当线程B执行reader()方法时,由于flag=false,条件判断"if (flag)"为false,所以不会进入if语句块执行操作4(a*a),也就不会打印任何内容。 这就是为什么在没有适当同步机制的情况下,多线程程序可能会出现不可预测的行为。
点赞
回复 取消回复
派聪明 2026年03月20日 14:53
理解正确!两种重排序情况确实都可能导致输出0或1: 1. **操作1和2重排序**: - 情况A:线程B先看到flag=true,执行操作4计算a*a(此时a=0),结果为0;之后线程A才执行操作1设置a=1 - 情况B:线程B看到flag=true后,线程A先执行操作1设置a=1,然后线程B执行操作4,结果为1 2. **操作3和4重排序**: - 可能先执行操作4计算a*a(此时a可能为0或1),再判断flag - 若a=0则结果为0,若a=1则结果为1 - 最终只有当flag=true时才会输出结果 这正是重排序在多线程环境下破坏程序语义的典型例子,也是volatile、synchronized等机制存在的必要性。
那我把情况分为两种 当1,2出现重排时 由于B只有在判断flag=true时打印 所以只会发生这两种情况1:2先执行,3判断成功4计算结果为0,1才执行,2:2先执行,3判断成功,1执行,4计算结果为1 第二种情况当3,4发生重拍时 无需判断flag的情况就计算a,这时有可能a=0 也有可能a=1 最后的结果也是1和0都有可能 对吗
点赞
回复 取消回复

2 条评论

vert 2026年03月20日 14:45
引用原文:flag变量是个标记,用来标识变量a是否已被写入。这里假设有两个线程A和B,A首先执行writer()方法,随后B线程接着执行reader()方法。线程B在执行操作4时,输出是多少呢?
@派聪明 线程B有没有可能在操作1,2之前就操作呢?这时flag=flase 线程b会有操作吗。如果在12之间执行线程b的话flag也是false 这时b会执行吗
点赞
回复3 取消回复
派聪明 2026年03月20日 14:46
是的,线程B完全有可能在操作1和2之前就执行reader()方法。因为线程A和B是并发执行的,没有同步机制保证writer()一定在reader()之前完成。 如果在操作1和2之间执行线程B,此时flag值仍然是false,因为操作2(flag=true)还未执行。 当线程B执行reader()方法时,由于flag=false,条件判断"if (flag)"为false,所以不会进入if语句块执行操作4(a*a),也就不会打印任何内容。 这就是为什么在没有适当同步机制的情况下,多线程程序可能会出现不可预测的行为。
点赞
回复 取消回复
vert 2026年03月20日 14:52
那我把情况分为两种 当1,2出现重排时 由于B只有在判断flag=true时打印 所以只会发生这两种情况1:2先执行,3判断成功4计算结果为0,1才执行,2:2先执行,3判断成功,1执行,4计算结果为1 第二种情况当3,4发生重拍时 无需判断flag的情况就计算a,这时有可能a=0 也有可能a=1 最后的结果也是1和0都有可能 对吗
是的,线程B完全有可能在操作1和2之前就执行reader()方法。因为线程A和B是并发执行的,没有同步机制保证writer()一定在reader()之前完成。 如果在操作1和2之间执行线程B,此时flag值仍然是false,因为操作2(flag=true)还未执行。 当线程B执行reader()方法时,由于flag=false,条件判断"if (flag)"为false,所以不会进入if语句块执行操作4(a*a),也就不会打印任何内容。 这就是为什么在没有适当同步机制的情况下,多线程程序可能会出现不可预测的行为。
点赞
回复 取消回复
派聪明 2026年03月20日 14:53
理解正确!两种重排序情况确实都可能导致输出0或1: 1. **操作1和2重排序**: - 情况A:线程B先看到flag=true,执行操作4计算a*a(此时a=0),结果为0;之后线程A才执行操作1设置a=1 - 情况B:线程B看到flag=true后,线程A先执行操作1设置a=1,然后线程B执行操作4,结果为1 2. **操作3和4重排序**: - 可能先执行操作4计算a*a(此时a可能为0或1),再判断flag - 若a=0则结果为0,若a=1则结果为1 - 最终只有当flag=true时才会输出结果 这正是重排序在多线程环境下破坏程序语义的典型例子,也是volatile、synchronized等机制存在的必要性。
那我把情况分为两种 当1,2出现重排时 由于B只有在判断flag=true时打印 所以只会发生这两种情况1:2先执行,3判断成功4计算结果为0,1才执行,2:2先执行,3判断成功,1执行,4计算结果为1 第二种情况当3,4发生重拍时 无需判断flag的情况就计算a,这时有可能a=0 也有可能a=1 最后的结果也是1和0都有可能 对吗
点赞
回复 取消回复
高贵的大侠 2023年03月08日 09:31
这个风格有点像极客时间←_←
点赞
回复 取消回复

目录