同步不适用于以下简单Java代码

时间:2018-11-28 19:04:42

标签: java multithreading synchronization thread-safety thread-synchronization

我已经开始学习Java中的多线程和同步,并决定做一些实际的事情。我写了一个简单的代码,其中有两个同步方法,它们的类对象由三个线程共享,但是当我运行此代码时,同步似乎不起作用,我在这里遗漏了一点吗?任何帮助将不胜感激。

Runner.java

public class Runner {

private int count;

public synchronized int getCount() {

    return count;

}

public synchronized void setCount(int count) {

    this.count = count;

}

}

ThreadOne.java

public class ThreadOne extends Thread{

Runner r;
int count;

public ThreadOne(Runner r , int count)
{
    this.r=r;
    this.count=count;
}

@Override
public void run()
{
    r.setCount(count);
    System.out.println("count is: "+r.getCount());

}

}

类似地,我有ThreadTwo.java和ThreadThree.java类,最后还有主类:

MainRunner.java

public class MainRunner {

public static void main(String[] args)  {
    // TODO Auto-generated method stub

    Runner runner = new Runner();
    ThreadOne one = new ThreadOne(runner, 1);
    ThreadTwo two = new ThreadTwo(runner, 2);
    ThreadThree three = new ThreadThree(runner, 3);

    one.start();
    two.start();
    three.start();


}

}

我得到的输出是:

count is: 1
count is: 3
count is: 2

它看起来不同步。我知道我在这里缺少什么,请告诉我。预先感谢

1 个答案:

答案 0 :(得分:1)

为什么不呢?序列化建立在修改和读取值的基础上,这意味着任何两个线程都不能出现在方法的getCountsetCount方法中单个Runner实例,但是它并不能保证执行顺序 ANY ,因为这完全与调度有关。在这里,ThreadThree可以首先开始执行,并将值设置为3并在其后打印,然后再用2将值设置为ThreadTwo并打印它。