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()),如果对象可用
同步方法锁定对象上的方法
synchronized void methodA () {
....
}
Run Code Online (Sandbox Code Playgroud)
在某种程度上相当于
void methodA () {
synchronized (this) {
....
}
}
Run Code Online (Sandbox Code Playgroud)
归档时间: |
|
查看次数: |
4991 次 |
最近记录: |