java线程的静态变量共享问题

拉轰的大蜗牛 2014-11-23 10:07:33
下面的输出结果可能是45; 90; 或 90;90 两种可能. 理论上static 静态变量不是被共享的吗? 会打印出90这个值说明static tick 变量确实是被共享的;
那么, 下面是我的分析:
出现90;90这个打印结果,是不是因为第一个线程执行完++到45,但还没来得执行System.out.println(Thread.currentThread().getName()+" : " + tick);. 第二个线程完成了++到了90, 这时候第一个线程再执行System.out.println(Thread.currentThread().getName()+" : " + tick); 就打印出90了. 然后第二个线程也当然是打印90!

最后,问题来了!!!! [cpu执行一个线程的run方法, 是不是不能保证一次性全部执行到结束!???]


package java11;

class Ticket implements Runnable //extends Thread
{
private static int tick = 0;

@Override
public void run() {

for (int i=0; i<10; i++){
tick = tick+ i;
}
System.out.println(Thread.currentThread().getName()+" : " + tick);
}
}


class TicketDemo
{
public static void main(String[] args)
{
Ticket t1 = new Ticket();
Ticket t2 = new Ticket();
Ticket t3 = new Ticket();
Ticket t4 = new Ticket();
new Thread(t1).start();
new Thread(t2).start();
}

}
...全文
556 6 打赏 收藏 转发到动态 举报
AI 作业
写回复
用AI写文章
6 条回复
切换为时间正序
请发表友善的回复…
发表回复
lliiqiang 2014-11-25
  • 打赏
  • 举报
回复
最后打印的时候也可能别的线程已经运行了一部分
  • 打赏
  • 举报
回复
WINDOWS中CPU的分配基于线程,cpu分配给每个线程的执行时间一般就是几十毫秒,这个执行时间也叫做时间片,线程自己的时间片到了就切换到下一个线程执行。
拉轰的大蜗牛 2014-11-23
  • 打赏
  • 举报
回复
引用 1 楼 cumtwyc 的回复:
cpu执行一个线程的run方法, 是不是不能保证一次性全部执行到结束?答案是不能。一个方法内部同一时间可能会有多个线程。
你好, 一个方法内部同一时间可能会有多个线程。 你指的是 一个run方法里面可能有多个线程?? 可我的代码是两个对象啊. 两个run方法呀
拉轰的大蜗牛 2014-11-23
  • 打赏
  • 举报
回复
你好, 一个方法内部同一时间可能会有多个线程。 你指的是 一个run方法里面可能有多个线程?? 我的代码是两个对象啊. 两个run方法呀
wyc_ 2014-11-23
  • 打赏
  • 举报
回复
cpu执行一个线程的run方法, 是不是不能保证一次性全部执行到结束?答案是不能。一个方法内部同一时间可能会有多个线程。

62,634

社区成员

发帖
与我相关
我的任务
社区描述
Java 2 Standard Edition
社区管理员
  • Java SE
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧