为了账号安全,请及时绑定邮箱和手机立即绑定

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

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

海绵宝宝撒 2019-03-15 18:15:08
使用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();  }}
查看完整描述

5 回答

?
慕后森

TA贡献1802条经验 获得超5个赞

我的理解是 Java 中每个对象都有一把锁,synchronized (this) 锁的是对象本身,synchronized (object) 锁的是一个作为锁的 Object。


以下代码中的两个 synchronized 块之间不构成同步,因为两个块的锁加在了不同对象上


class SyncSample {

    

    Object lock = new Object();

    

    synchronized void m1() {

        System.out.println("m1");

    }

    

    void m2() {

        synchronized (lock) {

            System.out.println("m2");

        }

    }

}


查看完整回答
反对 回复 2019-04-17
?
梦里花落0921

TA贡献1772条经验 获得超6个赞

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


查看完整回答
反对 回复 2019-04-17
?
拉莫斯之舞

TA贡献1820条经验 获得超10个赞

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


查看完整回答
反对 回复 2019-04-17
  • 5 回答
  • 0 关注
  • 525 浏览

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信