java - 对于以下简单的 Java 代码,同步不起作用

标签 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

看起来不同步。我知道我在这里遗漏了一些东西,请告诉我。提前致谢

最佳答案

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

关于java - 对于以下简单的 Java 代码,同步不起作用,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/53526415/

相关文章:

multithreading - Groovy 有 block 级同步的注释吗?

c# - 我应该*总是*同步访问从多个线程使用的所有双字段/属性/变量吗?

java - 不能使用列表的元素作为对象构造函数中的参数

c++ - std::mutex 和 std::atomic 的链接问题

java - 检查 2 个字符串是否包含相同的字符?

multithreading - Process VS thread : can two processes share the same shared memory ? 可以两个线程吗?

iphone - 为每个新的 NSOperation 或线程创建一个新的 NSManagedObjectContext 是否足够?

windows - 跨平台文件同步工具

java - 类似工厂的图案,带 Spring bean ,没有开关盒

java - Android ScrollView 从子 WebView 窃取触摸事件