线程不会增加值

时间:2014-04-09 15:42:48

标签: java multithreading

我期望下面将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(); 

    }
}

4 个答案:

答案 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。