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

 找回密码
 加入黑马

QQ登录

只需一步,快速开始

© 黄丽慧 中级黑马   /  2012-7-3 10:20  /  2421 人查看  /  6 人回复  /   0 人收藏 转载请遵从CC协议 禁止商业使用本文

本帖最后由 黄丽慧 于 2012-7-3 10:38 编辑

刚刚在看毕老师的多线程视频中的售票例子,四个窗口同时卖票,创建四个线程对象同时卖票如:
class ticket extends Thread
{
private int tick=100;
public void run()
{
while(true)
{
if(tick>0)
System.out.println(Thread.currentThread().getName()+"...sale"+tick--);
}
}
}

public class ticketDemo
{
public static void main(String[] args)
{
ticket t1=new ticket();
ticket t2=new ticket();
ticket t3=new ticket();
ticket t4=new ticket();
t1.start();
t2.start();
t3.start();
t4.start();
}
}
//上面程序的运行结果是四个窗口同时各卖1-99号,这样就会出现重号,这是不符合事实的。
当把tick变量定义成static类型时,运行的结果就是正确的。
我的问题是:为什么把tick变量定义成static类型时这个问题就能解决了呢?是不是当tick定义成static类型时,tick变量存放在方法区,每个线程对象创建后,并不是各自在创建一个tick变量,而是调用方法区内的同一个变量——即该tick变量啊。。

评分

参与人数 1技术分 +1 收起 理由
蒋映辉 + 1

查看全部评分

6 个回复

倒序浏览
你说的没错
方法区中的变量,即静态变量,被所有线程共享
回复 使用道具 举报
static修饰的变量在静态区 只存在一个,无论是通过对象名.变量名 还是类名.变量名调用都是调用这一个,而不是new 一个就创建一个新的变量。
回复 使用道具 举报
我也不写什么代码了,用大白话跟你说吧,不加静态,每个窗口都有100张票,卖票会出现重号。但是加了Static之后,相当于四个窗口共享或者共用这100张票,总共票数只有100张,不会出现问题。这是静态的特点之一。不知道这样说楼主明白不。
回复 使用道具 举报
嗯,好的,我知道了
回复 使用道具 举报
首先呢,创建对象时,类中的成员变量就要被分配空间到堆内存中,如果创建4个对象,就等于在堆内存中给4个tick赋值了,所以必然每个窗口都会售出100整票。当tick加上static以后就存放在方法区中的静态区了,变量被共享,四个对象都可以改变tick的值,并且tick只有一个。分清静态变量和非静态变量在内存中的储存位置不同才是关键。
回复 使用道具 举报
首先:静态变量的特点:
它是随着类的加载然后自然就到了内存中(共享数据区) 不需要创建对象的时候它就已经到内存中去了
而当各个对象创建之后,当他们用到这个变量时候   直接调用共享数据区的该变量就行了  也就是说多个对象共用这一个静态变量
票数要定义成static类型的  private static ticket=100;
它作为共享数据,不能写成局部变量
这样多个对象就可以操作同个资源了,不会发生多人买到同一张票的情况.
回复 使用道具 举报
您需要登录后才可以回帖 登录 | 加入黑马