同步不适用于以下简单Java代码
我已经开始学习Java中的多线程和同步,并决定做一些实际的工作。我写了一个简单的代码,其中我有两个同步的方法,它们的类对象由三个线程共享,但是当我运行这段代码时,同步似乎不起作用,我是否遗漏了一点?非常感谢您的帮助 Runner.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
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?”它什么都不运行。如果您选择描述事物是什么/事物的含义/事物的用途的名称,您的代码将更容易让其他人阅读。