Java 内锁的工作原理

Java 内锁的工作原理,java,Java,当两个不同的线程尝试同时访问get和set时,是否会因为锁定check object而以同步方式发生?由于这两种方法都是非静态的和同步的,任何时候都没有两个线程可以同时执行这两种方法,如果它们属于同一实例 是的,它将以同步方式发生,在这个类的实例中 创建Check c=newcheck()时 两个线程,即t1、t2尝试同时访问c.getChange()和c.setChange(),只有一个线程有权访问监视器(即实例c),另一个线程必须等待前一个线程完成工作并释放监视器 在这里,实例c是用于同步访

当两个不同的线程尝试同时访问get和set时,是否会因为锁定check object而以同步方式发生?

由于这两种方法都是非静态的同步的,任何时候都没有两个线程可以同时执行这两种方法,如果它们属于同一实例

是的,它将以同步方式发生,在这个类的实例中

创建
Check c=newcheck()时

两个线程,即
t1、t2
尝试同时访问
c.getChange()
c.setChange()
,只有一个线程有权访问监视器(即实例
c
),另一个线程必须等待前一个线程完成工作并释放监视器


在这里,实例
c
是用于同步访问的默认监视器,,因为这两种方法都是非静态的同步的,如果它们属于同一实例,则在任何实例中都没有两个线程可以同时执行这两种方法

是的,它将以同步方式发生,在这个类的实例中

创建
Check c=newcheck()时

两个线程,即
t1、t2
尝试同时访问
c.getChange()
c.setChange()
,只有一个线程有权访问监视器(即实例
c
),另一个线程必须等待前一个线程完成工作并释放监视器


这里的实例
c
是用于同步访问的默认监视器,只有一个线程可以持有对象的锁。然后,只有该线程可以进入该对象上的同步方法。没有其他线程可以访问该对象的任何同步方法

但是,线程可以通过调用

public class Check {

    public boolean toChange = false;

    public synchronized boolean getChange() {
        return tochange
    }

    public synchronized setChange(boolean change) {
        this.tochange = change
    }
}
在第一个线程释放Check对象实例上的锁之前,其他线程将处于阻止状态。另外请注意,任何线程都可以输入不在对象上同步的类的方法


因此答案是两个不同的线程不能同时访问get和set方法

只有一个线程可以持有对象的锁。然后,只有该线程可以进入该对象上的同步方法。没有其他线程可以访问该对象的任何同步方法

但是,线程可以通过调用

public class Check {

    public boolean toChange = false;

    public synchronized boolean getChange() {
        return tochange
    }

    public synchronized setChange(boolean change) {
        this.tochange = change
    }
}
在第一个线程释放Check对象实例上的锁之前,其他线程将处于阻止状态。另外请注意,任何线程都可以输入不在对象上同步的类的方法


因此答案是两个不同的线程不能同时访问get和set方法

感谢回复,所以它确实依赖于获取对象锁,在任何给定时间只能由一个线程获取。感谢回复,所以它确实依赖于获取对象锁,在任何给定时间只能由一个线程获取。