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

 找回密码
 加入黑马

QQ登录

只需一步,快速开始

© 刘晓 中级黑马   /  2013-6-13 16:06  /  1871 人查看  /  11 人回复  /   0 人收藏 转载请遵从CC协议 禁止商业使用本文

本帖最后由 刘晓 于 2013-6-14 08:44 编辑

为什么在Tick类中的ticket变量加了静态修饰符后,下面的线程都执行了;在没有加之前,只有一个线程执行?
  1. package text;
  2. class Tick extends Thread
  3. {
  4.         private static int ticket=20;
  5.         public void run()
  6.         {
  7.                 while(true)
  8.                 {
  9.                         if(ticket>0)
  10.                         {
  11.                                 System.out.println(currentThread().getName()+"....sale..."+ticket--);
  12.                         }
  13.                 }
  14.         }
  15.         }
  16. public class Text1
  17. {
  18.         public static void main(String[] args)
  19.         {
  20.                 Tick t1=new Tick();
  21.                 Tick t2=new Tick();
  22.                 Tick t3=new Tick();
  23.                 t1.start();
  24.                 t2.start();
  25.                 t3.start();               
  26.         }
  27. }
复制代码

评分

参与人数 1技术分 +1 收起 理由
孙百鑫 + 1 神马都是浮云

查看全部评分

11 个回复

倒序浏览
都会执行,跟static无关,可能是你赋值太小了,用100试试
回复 使用道具 举报
              Tick t1=new Tick();
                Tick t2=new Tick();
                Tick t3=new Tick();
                t1.start();
                t2.start();
                t3.start();  
在你没加static的时候,你创建的三个进程之间没有必然关系,但是当你加了static关键字之后,每个进程都
操作同一个Ticket变量,至于你说的没加static关键字就是有一个线程启动其实是假象,你把变量的初始值
变大一点你就会看到每个线程都启动动了  ,要不你就在dos下运行你也会看到结果。           
回复 使用道具 举报
你加了static就是所有tick类对象共享的成员变量!!如果没有加就是每new一个tick
对象就有一个拥有成员变量ticket!!不管你加不加,你这的都是线程不安全的!!

评分

参与人数 1技术分 +1 收起 理由
孙百鑫 + 1 赞一个!

查看全部评分

回复 使用道具 举报
还有一个不是答案的建议,你用text ,我想你是想起测试名字,测试是test,开发代码细心很重要哦
回复 使用道具 举报
张承富 发表于 2013-6-13 16:50
还有一个不是答案的建议,你用text ,我想你是想起测试名字,测试是test,开发代码细心很重要哦 ...

呵呵,这都被你发现了,以后定细心。
回复 使用道具 举报
刘晓 中级黑马 2013-6-13 19:11:31
7#
张承富 发表于 2013-6-13 16:34
都会执行,跟static无关,可能是你赋值太小了,用100试试

和赋值小没有关系,你可以试试。
回复 使用道具 举报
刘晓 中级黑马 2013-6-13 19:14:35
8#
江南雨 发表于 2013-6-13 16:38
你加了static就是所有tick类对象共享的成员变量!!如果没有加就是每new一个tick
对象就有一个拥有成员变量 ...

嗯,是的,不管加不加,这线程都是不安全的。想要安全,需要synchronized(对象){};
回复 使用道具 举报
楼主您好.如果问题解决的话,请将问题改成已解决哦~
回复 使用道具 举报
孙百鑫 发表于 2013-6-14 04:56
楼主您好.如果问题解决的话,请将问题改成已解决哦~

你什么时候成为版主的?:dizzy:
回复 使用道具 举报
刘晓 发表于 2013-6-14 08:44
你什么时候成为版主的?

大约在冬季哈哈
回复 使用道具 举报

好吧,这个夏天有点冷。。。
回复 使用道具 举报
您需要登录后才可以回帖 登录 | 加入黑马