Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/392.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
同步不适用于以下简单Java代码_Java_Multithreading_Synchronization_Thread Safety_Thread Synchronization - Fatal编程技术网

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

同步不适用于以下简单Java代码,java,multithreading,synchronization,thread-safety,thread-synchronization,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 se

我已经开始学习Java中的多线程和同步,并决定做一些实际的工作。我写了一个简单的代码,其中我有两个同步的方法,它们的类对象由三个线程共享,但是当我运行这段代码时,同步似乎不起作用,我是否遗漏了一点?非常感谢您的帮助

Runner.java

public class Runner {

private int count;

public synchronized int getCount() {

    return count;

}

public synchronized void setCount(int count) {

    this.count = count;

}
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();


}
}

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 Runner {

private int count;

public synchronized int getCount() {

    return count;

}

public synchronized void setCount(int count) {

    this.count = count;

}
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

它看起来不同步。我知道我遗漏了什么,请告诉我。提前谢谢

为什么不呢?序列化是基于修改和读取值而建立的,这意味着任何两个线程都不能出现在单个
运行程序
实例的
getCount
setCount
方法中,但它不能保证执行顺序,因为这都是关于日程安排的。在这里,
ThreadThree
可以先开始执行,然后将值设置为
3
,然后打印,然后通过
ThreadTwo
将值设置为
2
,然后打印。

同步不会建立顺序。而且您没有同步
run()
。@shmosel,但它不应该为上述代码打印1,2,3吗?如果没有,我如何通过同步实现它?不,不应该。如果需要顺序执行,则不需要全部线程。同步对这项工作来说是个错误的工具。我明白了!非常感谢!:)为什么您的
Runner
类名为“Runner?”它什么都不运行。如果您选择描述事物是什么/事物的含义/事物的用途的名称,您的代码将更容易让其他人阅读。