猿问

结合下面一段java代码,请问一下synchronized 块对当前对象和其他对象有是什么区别?

使用Synchronized (this) 对当前对象进行同步化,这很容易理解;

但对其他对象同步化,应该怎样理解?比如下面的代码,synchronized(syncObject) 语句,syncObject 就是一个普通对象Object,这样又有什么意义了?


import static net.mindview.util.Print.*;


class DualSynch {

  private Object syncObject = new Object();

  public synchronized void f() {

    for(int i = 0; i < 5; i++) {

      print("f()");

      Thread.yield();

    }

  }

  public void g() {

    synchronized(syncObject) {

      for(int i = 0; i < 5; i++) {

        print("g()");

        Thread.yield();

      }

    }

  }

}


public class SyncObject {

  public static void main(String[] args) {

    final DualSynch ds = new DualSynch();

    new Thread() {

      public void run() {

        ds.f();

      }

    }.start();

    ds.g();

  }

}


海绵宝宝撒
浏览 527回答 5
5回答

慕后森

我的理解是 Java 中每个对象都有一把锁,synchronized (this) 锁的是对象本身,synchronized (object) 锁的是一个作为锁的 Object。以下代码中的两个 synchronized 块之间不构成同步,因为两个块的锁加在了不同对象上class SyncSample {&nbsp; &nbsp;&nbsp;&nbsp; &nbsp; Object lock = new Object();&nbsp; &nbsp;&nbsp;&nbsp; &nbsp; synchronized void m1() {&nbsp; &nbsp; &nbsp; &nbsp; System.out.println("m1");&nbsp; &nbsp; }&nbsp; &nbsp;&nbsp;&nbsp; &nbsp; void m2() {&nbsp; &nbsp; &nbsp; &nbsp; synchronized (lock) {&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; System.out.println("m2");&nbsp; &nbsp; &nbsp; &nbsp; }&nbsp; &nbsp; }}

梦里花落0921

利用一个单独的对象作为锁对象。这种情况下也可以使用ReentrantLock,然后用它的lock()、unlock()代替synchronized。

拉莫斯之舞

public synchronized void f()相当于synchronized (this)也就是对象本身,synchronized(syncObject)加锁的是另外一个对象syncObject。这样的结果就是:你new出来一个DualSynch对象,在两个线程中f()方法和g()方法是可以并发执行的,但是在两个线程中f()和f()不能并发执行,g()和g()不能并发执行。
随时随地看视频慕课网APP

相关分类

Java
我要回答