黑马程序员技术交流社区

标题: 以下代码存疑 [打印本页]

作者: nyk    时间: 2014-10-23 11:57
标题: 以下代码存疑
本帖最后由 nyk 于 2014-10-23 14:39 编辑
  1. public class Test {
  2.         public static void main(String[] args) {
  3.                 ThreadDemo d1 = new ThreadDemo();
  4.                 ThreadDemo d2 = new ThreadDemo();
  5.                 d1.start();
  6.                 d2.start();
  7.         }
  8. }

  9. class ThreadDemo extends Thread {
  10.         private static int n = 0;

  11.         public void run() {
  12.                 for (int i = 0; i < 20; i++) {
  13.                         n++;
  14.                         System.out.println(this.getName() + "*****" + n);
  15.                 }
  16.         }
  17. }
复制代码


为什么会出现以下情况
  1. Thread-1+++2
  2. Thread-0+++2
  3. Thread-1+++3
  4. Thread-0+++4
  5. Thread-1+++5
  6. Thread-0+++6
  7. Thread-1+++7
  8. Thread-0+++8
  9. Thread-1+++9
  10. Thread-1+++11
  11. Thread-0+++10
复制代码

会出现两个2
作者: 践行渐远    时间: 2014-10-23 12:14
没有错哦,你本来就是创建了两个线程交替运行的,出现两个2,一个是线程Thread-1的,另一个是线程Thread-0的。
作者: 香草芭芙    时间: 2014-10-23 12:29
  1. public class Test
  2. {
  3.         public static void main(String[] args) throws Exception
  4.         {
  5.                 ThreadDemo d1 = new ThreadDemo();
  6.                 ThreadDemo d2 = new ThreadDemo();
  7.                 d1.start();
  8. //                Thread.sleep(10);
  9.                 d2.start();
  10.         }
  11. }
  12. class ThreadDemo extends Thread
  13. {
  14.         private static int n = 0;
  15.         public void run()
  16.         {
  17.                 for (int i = 0; i < 20; i++)
  18.                 {
  19.                         n++; //d1 执行到这,被d2抢去CPU, d1不能动,这时n = 1 , d2 执行到这 n = 1+1=2;
  20.                              //1)d1停 d2输出2 --> d2停 d1输出2
  21.                              //2)d2停 d1输出2 --> d1停 d2输出2
  22.                              //以上2种情况都可能发生.之后就互相抢CPU 优先权都是5 所以差不多是交替执行.
  23.                         System.out.println(Thread.currentThread().getName() + "*****" + n);
  24.                 }
  25.         }
  26. }
复制代码



作者: D.reamJA    时间: 2014-10-23 12:42
香草芭芙 发表于 2014-10-23 12:29

很详细,凑字数
作者: D.reamJA    时间: 2014-10-23 12:43
香草芭芙 发表于 2014-10-23 12:29

很详细,多线程操作相同数据时要考虑线程同步
作者: nyk    时间: 2014-10-23 14:39
明白了,谢谢各位
作者: mingtianrsm    时间: 2014-10-23 14:49
践行渐远 发表于 2014-10-23 12:14
没有错哦,你本来就是创建了两个线程交替运行的,出现两个2,一个是线程Thread-1的,另一个是线程Thread-0 ...

他的n是static的。是共享数据
作者: 践行渐远    时间: 2014-10-23 14:55
mingtianrsm 发表于 2014-10-23 14:49
他的n是static的。是共享数据

哦,谢谢哈。漏看了,那就需要对操作共享数据的代码加同步了吧:)
作者: cxdzh    时间: 2014-10-23 20:09
视频继续往后看,,毕老师有详细解释.
作者: Mr.Ni    时间: 2014-10-23 23:21
的确是同步安全问题
作者: MeryStyle    时间: 2014-10-24 00:23
线程安全问题,使用线程同步解决
作者: 王世虎    时间: 2014-10-24 10:29
推荐你看一下毕老师基础教程视频第十一天的09和10部分,多线程的安全问题和多线程的同步代码块。相信你会受益很大的!
作者: fly_saint    时间: 2014-10-24 11:12
香草芭芙 发表于 2014-10-23 12:29

有些疑问:
既然d1是在
n++
之前停止的,那么在d2抢到执行权后无论是
1)d1停 d2输出2 --> d2停 d1输出2    d1怎么会输出2?d1停止在n++之前,只要执行n++   ,不就变成n=3了吗?
2)d2停 d1输出2 --> d1停 d2输出2        d2停止后,d1不是还要执行n++么?执行完,n=3
作者: yl82846094    时间: 2014-10-24 13:16
都是大神,看看,看看
作者: nyk    时间: 2014-10-24 15:07
王世虎 发表于 2014-10-24 10:29
推荐你看一下毕老师基础教程视频第十一天的09和10部分,多线程的安全问题和多线程的同步代码块。相信你会受 ...

谢谢,正在看
作者: void    时间: 2014-10-24 19:39
应该加锁----
作者: 齐宁宁    时间: 2014-10-24 19:43
同步安全问题:lol
作者: 郑飞    时间: 2014-10-25 00:54
只有有线程挂在了n++后面,再次恢复运行后输出得肯定是另一个线程刚刚输出得n值(因为你是从n++,之后开始运行的)
作者: 戏言丶    时间: 2014-10-25 07:52
fly_saint 发表于 2014-10-24 11:12
有些疑问:
既然d1是在
n++

是运行了n++后停的,之后获得执行资格就往下执行了
作者: Tsinvat    时间: 2014-10-25 09:02
那个n是不同对象的成员变量,两个线程执行的不是一个对象,我不清楚为什么会下面数字会交替的打印?




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