黑马程序员技术交流社区

标题: 关于for循环 [打印本页]

作者: jiangyutc    时间: 2014-2-20 23:15
标题: 关于for循环
本帖最后由 jiangyutc 于 2014-2-21 00:07 编辑

for(第一步执行(只有第一次执行,后面不再执行),第二步执行,第三步执行)
{
第四第执行
}






for(第一步执行(只有第一次执行,后面不再执行),第二步执行,第四步执行)
{
第三第执行
}


上面的两个for循环表达式哪个是真确的????
  1. /*
  2. 需求:储户,两个,每个都到银行存钱每次存100,,共存三次。
  3. */

  4. class Bank
  5. {
  6.         private int sum;
  7.         public synchronized void add(int num)//同步函数
  8.         {

  9.                         sum = sum + num;
  10.                         try{Thread.sleep(10);}catch(InterruptedException e){}
  11.                         System.out.println("sum="+sum);

  12.         }
  13. }


  14. class Cus implements Runnable
  15. {
  16.         private Bank b = new Bank();
  17.         public void run()
  18.         {
  19.                 for(int x=0; x<3; x++)
  20.                 {
  21.                         try {
  22.                                 Thread.sleep(100);
  23.                         } catch (InterruptedException e) {                                
  24.                                 e.printStackTrace();
  25.                         }
  26.                         b.add(100);
  27.                 }
  28.         }
  29. }


  30. class BankDemo
  31. {
  32.         public static void main(String[] args)
  33.         {
  34.                 Cus c = new Cus();
  35.                 Thread t1 = new Thread(c);
  36.                 Thread t2 = new Thread(c);
  37.                 t1.start();
  38.                 t2.start();
  39.         }
  40. }
复制代码


如果第二个for是真确的
为什么这里没发生线程安全问题呢
比如有两个线程执行这个程序,for循环是按照第二种表达式运行
假设x=2,一个线程获得执行权,进了for循环,没等x++,进去后sleep了,就失去了执行权
然后第二个线程也进来执行代码了
本来是运行三次的for循环,不就运行了四次吗?


作者: 何伟超    时间: 2014-2-20 23:18
for(1(只有第一次执行,后面不再执行),2 5,4 7)
{
3 6
}
作者: 徐老爹    时间: 2014-2-20 23:21
for(第一步执行(只有第一次执行,后面不再执行),第二步执行,第四步执行)
{
第三第执行
}

这个是正确的,如果说完整的话,后面将继续3>4>2>3>4>2这样的循环,你可以看看老毕的视频,他在讲for循环的时候专门画图解释了流程走向。
作者: jiangyutc    时间: 2014-2-20 23:24
徐老爹 发表于 2014-2-20 23:21
for(第一步执行(只有第一次执行,后面不再执行),第二步执行,第四步执行)
{
第三第执行
  1. class Cus implements Runnable
  2. {
  3.         private Bank b = new Bank();
  4.         public void run()
  5.         {
  6.                 for(int x=0; x<3; x++)
  7.                 {
  8.                         try {
  9.                                 Thread.sleep(100);
  10.                         } catch (InterruptedException e) {
  11.                                 // TODO Auto-generated catch block
  12.                                 e.printStackTrace();
  13.                         }
  14.                         b.add(100);
  15.                 }
  16.         }
  17. }
复制代码


如果是第二个,为什么没出现线程安全问题呢?
作者: 迦罗叶    时间: 2014-2-20 23:24
第二个表达式是正确的,我说一下顺序
1,初始化表达式
2,循环判断条件表达式
3,for中要执行的语句,即(循环体)
4,后面循环后的操作表达式
2
3
4.........
按照1234234234.....的顺序一直进行,直到条件不满足 退出循环
作者: kkopopo    时间: 2014-2-20 23:41
为啥会发生线程安全问题?楼主想测试什么样的安全问题? 楼主的问题好奇怪? 我都不知道你问的是什么?

据我所知线程安全问题是多线程同步时才会涉及到的吧,你的程序时单线程,为什么会发生线程安全问题?

作者: 白_蓝(八公)    时间: 2014-2-20 23:48
for(第一步执行(只有第一次执行,后面不再执行),第二步执行,第四步执行)
{
第三第执行
}
这个是正确的!
for循环的流程是先第一部进行变量复制!也就是1;然后是判断条件!2;接着是循环体运行,3;循环体运行完之后自己设置的变量自增或怎么什么条件之类的,4;接着再判断条件是否满足,决定循环体的退出或者继续!

而楼主你说的安全问题!你的for中是不存在的,因为在你的循环体中只会判断条件是否满足,满足运行循环体,不满足退出for循环!
作者: ghhryr    时间: 2014-2-20 23:56
你的这个程序要问线程安全的问题???没明白,如果要产生线程安全的问题:
1.有两个以上的线程访问同一个资源。
2.操作共享资源的代码不是原子性的,
你的程序中第一个条件没有满足,第二个条件只是add一个方法
难道你的意思是在for循环中会产生安全问题??
作者: jiangyutc    时间: 2014-2-20 23:58
白_蓝(八公) 发表于 2014-2-20 23:48
for(第一步执行(只有第一次执行,后面不再执行),第二步执行,第四步执行)
{
第三第执行

帖子已修改
麻烦在按照我的提问解答下
谢谢
作者: jiangyutc    时间: 2014-2-21 00:08
ghhryr 发表于 2014-2-20 23:56
你的这个程序要问线程安全的问题???没明白,如果要产生线程安全的问题:
1.有两个以上的线程访问同一个 ...

问题已解决
多谢
作者: 白_蓝(八公)    时间: 2014-2-21 02:12
jiangyutc 发表于 2014-2-20 23:58
帖子已修改
麻烦在按照我的提问解答下
谢谢

额!按照的我的理解来的话是有可能发生你说的第四次运行的~因为是两个线程共同占用了资源!~不过for循环本身是不出问题的,只是循环体要处理的数据(代码)---资源可能错乱!比如我们像银行add钱!!就可能多加~~所以要进行安全机制处理!!可以使用synchronized
作者: .......    时间: 2014-2-21 07:10
for(第一步执行(只有第一次执行,后面不再执行),第二步执行,第四步执行)
{
第三第执行
}
作者: .......    时间: 2014-2-21 07:12
for(第一步执行(只有第一次执行,后面不再执行),第二步执行,第四步执行)
{
第三第执行
}
  楼主看毕老师的视频的时候认真点! 这些毕老师都会讲到的
作者: jiangyutc    时间: 2014-2-21 12:06
....... 发表于 2014-2-21 07:12
for(第一步执行(只有第一次执行,后面不再执行),第二步执行,第四步执行)
{
第三第执行

呵呵
我知道毕老师视频讲过
但是在遇到这个问题时怀疑过
不过现在问题解决了,确实是第二个
多谢了





欢迎光临 黑马程序员技术交流社区 (http://bbs.itheima.com/) 黑马程序员IT技术论坛 X3.2