【问题标题】:Thread synchronization and execution order线程同步和执行顺序
【发布时间】:2018-08-05 21:02:37
【问题描述】:

所以想象有一个类 A 像这样实现 Runnable:

class A implements Runnable {
    C c;
    Thread t;

    public A(C c){
        this.c = c;
        t = new Thread(this);
    }

    public void start(){
        t.start();
    }

    public void run(){
        for (int i = 0; i < 5; i++){
            c.doIt();
        }
    }
}

C 类只包含一个同步方法,按字符打印当前线程详细信息,如下所示:

class C {
    synchronized void doIt(){
        String s = Thread.currentThread().toString();

        for (int i = 0; i < s.length(); i++) {
            System.out.print(s.charAt(i));
        }

        System.out.println();
    }
}

如果我在我的 main 方法中创建 2 个线程,同时使用 C 类的共享对象 c,我不应该收到随机的线程执行顺序,因为只有 doIt 方法是同步的吗?我想象的方式是,在 t1 完成 doIt() 的迭代后,t2 线程将能够接收控制。似乎锁是由 t1 获取的,直到线程的整个循环完成它的工作。所以我的问题是 - 同步是否意味着线程也必须在另一个线程启动之前完成(不仅仅是 doIt() 的同步)?

【问题讨论】:

  • 你上过Oracle Tutorial: Concurrency的课程了吗?
  • 是的,你是对的。这两个线程可以混合在一起。但是你的循环只循环了 5 次。太少了,任何线程都不能被另一个线程启动。我将循环更改为 500,得到了您的期望。

标签: java multithreading synchronization execution


【解决方案1】:

同步实例方法 这是一个同步的实例方法:

  public synchronized void add(int value){
      this.count += value;
  }

注意方法声明中同步关键字的使用。这告诉 Java 方法是同步的。

Java 中的同步实例方法在拥有该方法的实例(对象)上同步。因此,每个实例都有其同步方法在不同的对象上同步:拥有的实例。只有一个线程可以在同步实例方法中执行。如果存在多个实例,则一次可以在每个实例的同步实例方法中执行一个线程。每个实例一个线程。 (c)http://tutorials.jenkov.com/java-concurrency/synchronized.html

因此,在您的情况下,这意味着另一个线程可以在第一个线程完成第一次调用 doIt() 时访问该方法,但这不能保证。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2018-06-16
    • 2017-08-17
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多