0

我创建了两个线程threadNewincrementer。这会产生i count=2增量 count=2的结果。

我的想法:它应该产生 i count=1增量 count=2。有人可以调查并建议如何解决吗?

    public class StaticThreadTest {

    //i = 0 for all instance of this class.
    private static int i = 0;


    /**
     * @param args
     */
    public static void main(String[] args) {

        //There is no guarantee of thread execution in sequence.
        StaticThreadTest st = new StaticThreadTest();
        StaticThreadTest st1 = new StaticThreadTest();
        st.threadNew.start();
        st1.incrementer.start();

    }

    Thread threadNew = new Thread(new Runnable() {

        @Override
        public void run() {

            synchronized (this) {
                i++;
                System.out.println("i count=" + i);
            }
        }
    });

    Thread incrementer = new Thread(new Runnable() {

        @Override
        public void run() {

        synchronized (this) {
            i++;
            System.out.println("increment count="+i);
        }
    }
});

}
4

5 回答 5

2

线程正在“this”上同步。但是两个线程的“this”是不同的。因此,实际上,没有同步。为了使同步工作,所有线程必须有一些共同点可以用来“锁定”。

在 StaticThreadTest 中创建一个静态字符串或对象并在其上进行同步。例如

static final Object SYNC_ON_ME = new Object();

然后,在后面的代码中,使用

synchronized(SYNC_ON_ME) { ... }

于 2013-09-02T18:27:33.153 回答
0

只需将 synchronized (this) 替换为...

synchronized (StaticThreadTest.class) {
 ...
}

效率不是很高,但无论如何...

于 2013-09-02T18:42:43.767 回答
0

这里的变量i is static

静态变量不存在于每个实例的基础上,而是存在于每个类的基础上。这意味着i可以从类的所有实例访问相同的静态变量。

因此,它在您启动线程时执行它,然后在您调用增量器时再次执行。

Synchronize would be effective on this object and not the static variable.
于 2013-09-02T18:27:08.960 回答
0

您正在创建 的两个完全独立的实例StaticThreadTest,它们不共享实例字段,在同步时也不同步this。如果您制作i非静态代码,您的代码应该可以工作,并将 main 方法替换为:

public static void main(String[] args) {
    StaticThreadTest st = new StaticThreadTest();
    st.threadNew.start();
    st.incrementer.start();
}
于 2013-09-02T18:27:15.390 回答
0

您的输出可能是正确的。这些线程不同步,因为您在不同的对象上同步。

发生的事情大概是

i++; // from threadNew, i is now 1
i++; // from incrementer, i is now 2
System.out.println("i count=" + i); // from threadNew outputs 2
System.out.println("increment count="+i); //from incrementer outputs 2

不过,您的示例没有多大意义。在同一个对象上同步。不要按照@Matt Ball 的建议创建两个实例

于 2013-09-02T18:29:18.323 回答