我期望下面将c值增加到2.但即使在第二个线程开始后我总是得到1个输出。
package test.main;
public class TestThread implements Runnable {
private int c=0;
@Override
public void run() {
synchronized(this){
c=c+1;
//wait(1000);
go();
}
}
private void go() {
System.out.println("Thread name :"+Thread.currentThread()+" in go() : "+c);
}
public static void main(String[] args) throws InterruptedException {
System.out.println("main()");
Thread t1 = new Thread(new TestThread(),"thread1");
Thread t2 = new Thread(new TestThread(),"thread2");
t1.start();
t2.start();
}
}
答案 0 :(得分:1)
您已创建了两个线程对象。
Thread t1 = new Thread(new TestThread(),"thread1");
Thread t2 = new Thread(new TestThread(),"thread2");
每个线程对象都有自己的c
副本作为非类级变量。它的实例变量。
所以,它不会给你一个值2
答案 1 :(得分:1)
在线程t1和t2中,您传递两个完全不同的对象。因此,在这两种情况下,它都会递增自己的c,这些c彼此无关。
使用单个对象
TestThread tt = new TestThread();
Thread t1 = new Thread(tt,"thread1");
Thread t2 = new Thread(tt,"thread2");
答案 2 :(得分:1)
每个TestThread对象都有自己的c副本,因此每个只增加一次。
答案 3 :(得分:0)
Thread t1 = new Thread(new TestThread(),"thread1");
Thread t2 = new Thread(new TestThread(),"thread2");
您正在创建两个不同的TestThread和
实例private int c=0;
是一个实例变量(不是类变量)。所以在每个Thread执行run()之后,c应该是1。