不同类

时间:2016-03-21 11:53:55

标签: java multithreading synchronized

我试图设置2个线程,增加或减少另一个类中的整数。我在同步这个属性方面遇到了一些问题。

这是我设置线程和计数器类的主要类:

public class Main {
public static void main(String[] arg) {
    Counter c = new Counter(10000000);
    Thread1 t1 = new Thread1(c);
    Runnable2 r2 = new Runnable2(c);
    Thread t2 = new Thread(r2);
    t1.start();
    t2.start();
    System.out.println(t.getNumber());
    }
}

这是我的柜台班:

public class Counter{
private int number;
private static final Object countLock = new Object();

public Counter(int number){
    this.number= number;
}

public void increase(){
    synchronized(countLock){
        number++;
    }
}

public void decrease(){
    synchronized(countLock){
        number--;
    }
}

public int getNumber(){
    return number;
}

}

这是我的Thread1类:( runnable类是相同的,只是使用'实现Runnable'而不是'扩展Thread')

public class Thread1 extends Thread{
private Counter c;

public Thread1(Counter c){
    this.c = c;
}

public void run(){
    for(int i = 0; i < c.getNumber(); i++){
        c.increase();
    }
}
}

但是,我的输出总是10000000.即使我同步了两种方法。 是否有人可以解释发生了什么?

3 个答案:

答案 0 :(得分:0)

当我运行你的代码时,System.out.println(t.getNumber());正在执行任何一个线程之前被执行。

答案 1 :(得分:0)

首先,这实际上永远不会完成,因为您在同一循环中增加了在for循环中用作上限的值。不确定这是否是所需的行为。

其次,您的System.out.println将(很可能)始终打印Counter中使用的初始值,因为线程没有时间完成工作。出于测试目的,您可以添加TimeUnit.SECONDS.sleep(10);之类的内容。但是对于更复杂的方法,我建议你看一下java.util.concurrent.Executorsjava.util.concurrent.ExecutorService(那里有很多例子)。

第三,如果用Counter替换int number java.util.concurrent.atomic.AtomicInteger,您的生活将会轻松很多。

答案 2 :(得分:0)

启动后添加t1.join(); t2.join();,以便线程在main线程执行sysout之前完成任务。

另一方面,我认为线索永远不会出现for loop,因为c.getNumber()不断增加。

我想你想要

int number=c.getNumber(); for(int i = 0; i < number; i++) {

而不是

for(int i = 0; i < c.getNumber(); i++) {