同步不适用于以下简单的 Java 代码
Synchronization not working for below simple Java code
我已经开始学习Java中的多线程和同步,并决定做一些实践。我写了一个简单的代码,其中我有两个同步方法,它们的 class 对象被三个线程共享,但是当我 运行 这段代码时,同步似乎不起作用,我在这里遗漏了一点?非常感谢任何帮助。
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 classes 最后是主要的 class:
主要Runner.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
看起来不同步。我知道我在这里遗漏了一些东西,请告诉我。提前致谢
为什么不呢?序列化建立在修改和读取值的基础上,这意味着任何两个线程都不能出现在getCount
或setCount
单个 Runner
实例的方法,但它不会对执行顺序做出 ANY 保证,因为它全都与调度有关。这里,ThreadThree
可以先开始他的执行,然后将值设置为3
,然后打印,然后通过ThreadTwo
将值设置为2
,然后打印出来。
我已经开始学习Java中的多线程和同步,并决定做一些实践。我写了一个简单的代码,其中我有两个同步方法,它们的 class 对象被三个线程共享,但是当我 运行 这段代码时,同步似乎不起作用,我在这里遗漏了一点?非常感谢任何帮助。
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 classes 最后是主要的 class:
主要Runner.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
看起来不同步。我知道我在这里遗漏了一些东西,请告诉我。提前致谢
为什么不呢?序列化建立在修改和读取值的基础上,这意味着任何两个线程都不能出现在getCount
或setCount
单个 Runner
实例的方法,但它不会对执行顺序做出 ANY 保证,因为它全都与调度有关。这里,ThreadThree
可以先开始他的执行,然后将值设置为3
,然后打印,然后通过ThreadTwo
将值设置为2
,然后打印出来。