java中为什么通过实现runnabale的线程中,a不用加static,这不是两个不同的线程吗,加上static才能共享吧,为什么不用加?
public class ThreadDemo
{
public static void main(String[] args)
{
MyThread mt1 = new MyThread();
MyThread mt2 = new MyThread();
Thread t1 = new Thread(mt1);
Thread t2 = new Thread(mt2);t1.start();
t2.start();
}
}class MyThread implements Runnable
{
private  int ticket = 10;
String a="1";//String a=new ("1");这个地方如果用new必须是static,为什么a="1"就不需要static?
public void run()
{
synchronized(a){
for(int i = 0; i < 20; i ++)
{
if(this.ticket > 0)
{
System.out.println("卖票:" + this.ticket--);
}
}
}
}

解决方案 »

  1.   

    和存储空间有关系.String a="1",1存储在内存空间中,new a("1")存储在堆内存中,Java可以共享内存空间的数据,而堆内存中的数据是不可以共享.
      

  2.   

    String a="1";中常量字符串放在方法区也叫静态区,每个a都共享常量字符串"1"
    String a= new String("1");中动态创建字符串,字符串在堆中,用static修饰a,表示类的变量,所有对象共享a引用的对象
      

  3.   

    String a="1";中每个实例中引用a不同,但a引用的字符串"1"相同
    两种方式都必须保证a引用的对象是同一个对象,即共享同一个对象实例
      

  4.   

    如果是局部常量,例如for循环里面定义的i也是在常量池中吗
      

  5.   

    如果是局部常量,例如函数或者循环里面定义的常量为什么不是存储在静态区,而是栈区呢
    比如function(){
    String a=1;
    }
      

  6.   

    static只是说明,该类的所有对象共享static修饰的东西,跟多线程没关系。