线程同步和执行顺序

时间:2018-08-05 21:02:37

标签: java multithreading synchronization execution

因此,想象有一个实现了Runnable的类A:

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

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

1 个答案:

答案 0 :(得分:2)

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

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

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

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

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