线程内在锁

xde*_*000 11 java multithreading

当我们谈论内在锁时,我们引用了我们要求锁或同步方法的对象?

锁定在对象上还是在同步方法上?

我糊涂了!

Pau*_*ams 16

内部锁在对象上:

class A
{
   public synchronized void method1(){...}
   public synchronized void method2(){...}
}
Run Code Online (Sandbox Code Playgroud)

如果线程A在method1中,则threadB无法进入method2.


Dhi*_*dya 10

在Java中,每次使用synchronized关键字都会隐含内在锁定

synchronized关键字的每次使用都与两种类型的内部锁定之一相关联:

"实例锁",附加到单个对象

一个"静态锁",附在一个类上

如果一个方法被声明为synchronized,那么它将在调用时获取实例锁或静态锁,具体取决于它是实例方法还是静态方法.

这两种类型的锁具有相似的行为,但完全相互独立.

获取实例锁只会阻止其他线程调用同步实例方法; 它不会阻止其他线程调用非同步方法,也不会阻止它们调用静态同步方法.

类似地,获取静态锁仅阻止其他线程调用静态同步方法; 它不会阻止其他线程调用非同步方法,也不会阻止它们调用同步实例方法.

在方法头之外,synchronized(this)获取实例锁.

静态锁可以通过两种方式在方法头之外获取:

synchronized(Blah.class),使用类文字

synchronized(this.getClass()),如果对象可用


nan*_*nda 4

同步方法锁定对象上的方法

synchronized void methodA () {
    ....    
}
Run Code Online (Sandbox Code Playgroud)

在某种程度上相当于

void methodA () {
    synchronized (this) {
        ....
    }
}
Run Code Online (Sandbox Code Playgroud)