A股上市公司传智教育(股票代码 003032)旗下技术交流社区北京昌平校区

 找回密码
 加入黑马

QQ登录

只需一步,快速开始

© nyk 中级黑马   /  2014-10-23 11:57  /  2036 人查看  /  19 人回复  /   0 人收藏 转载请遵从CC协议 禁止商业使用本文

本帖最后由 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

评分

参与人数 1技术分 +1 收起 理由
杨佳名 + 1 淡定

查看全部评分

19 个回复

倒序浏览
没有错哦,你本来就是创建了两个线程交替运行的,出现两个2,一个是线程Thread-1的,另一个是线程Thread-0的。
回复 使用道具 举报
  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. }
复制代码


评分

参与人数 1技术分 +1 收起 理由
杨佳名 + 1 赞一个!

查看全部评分

回复 使用道具 举报 2 0
回复 使用道具 举报

很详细,多线程操作相同数据时要考虑线程同步
回复 使用道具 举报
nyk 中级黑马 2014-10-23 14:39:10
地板
明白了,谢谢各位
回复 使用道具 举报
践行渐远 发表于 2014-10-23 12:14
没有错哦,你本来就是创建了两个线程交替运行的,出现两个2,一个是线程Thread-1的,另一个是线程Thread-0 ...

他的n是static的。是共享数据

评分

参与人数 1技术分 +1 收起 理由
杨佳名 + 1 赞一个!

查看全部评分

回复 使用道具 举报
mingtianrsm 发表于 2014-10-23 14:49
他的n是static的。是共享数据

哦,谢谢哈。漏看了,那就需要对操作共享数据的代码加同步了吧:)
回复 使用道具 举报
cxdzh 中级黑马 2014-10-23 20:09:45
9#
视频继续往后看,,毕老师有详细解释.
回复 使用道具 举报
Mr.Ni 中级黑马 2014-10-23 23:21:09
10#
的确是同步安全问题
回复 使用道具 举报
MeryStyle 来自手机 中级黑马 2014-10-24 00:23:44
11#
线程安全问题,使用线程同步解决
回复 使用道具 举报
推荐你看一下毕老师基础教程视频第十一天的09和10部分,多线程的安全问题和多线程的同步代码块。相信你会受益很大的!
回复 使用道具 举报

有些疑问:
既然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
回复 使用道具 举报
都是大神,看看,看看
回复 使用道具 举报
nyk 中级黑马 2014-10-24 15:07:28
15#
王世虎 发表于 2014-10-24 10:29
推荐你看一下毕老师基础教程视频第十一天的09和10部分,多线程的安全问题和多线程的同步代码块。相信你会受 ...

谢谢,正在看
回复 使用道具 举报
void 中级黑马 2014-10-24 19:39:52
16#
应该加锁----
回复 使用道具 举报
同步安全问题:lol
回复 使用道具 举报
郑飞 高级黑马 2014-10-25 00:54:07
18#
只有有线程挂在了n++后面,再次恢复运行后输出得肯定是另一个线程刚刚输出得n值(因为你是从n++,之后开始运行的)
回复 使用道具 举报
fly_saint 发表于 2014-10-24 11:12
有些疑问:
既然d1是在
n++

是运行了n++后停的,之后获得执行资格就往下执行了
回复 使用道具 举报
那个n是不同对象的成员变量,两个线程执行的不是一个对象,我不清楚为什么会下面数字会交替的打印?
回复 使用道具 举报
您需要登录后才可以回帖 登录 | 加入黑马