0 java
例子:
class A {
public static Integer age;
}
// Approach 1:
class Exe1 {
public void exec() {
synchronized(A.class) {
//do something
}
}
}
// Approach 2
public class Exec2 {
public void exec() {
synchronized(A.age) {
//do something
}
}
}
Run Code Online (Sandbox Code Playgroud)
方法 2 中的代码与方法 1 的行为方式相同吗?
我的意思是,这两种方法在控制代码执行顺序方面具有相同的效果吗?
不,不是的。
该块由类的实例synchronize(A.class)控制,该实例始终存在并且始终是相同的实例1。因此,每次执行都由同一实例锁定/同步。Class<A>AExe1.exec()
然而,该synchronize(A.age)块由当前位于静态字段中的当前实例控制A.age。可以通过将不同的实例分配给A.agelike来更改它A.age = Integer.valueOf(42);。之后, 的每次执行都由该Exe2.exec()对象控制,独立于当前锁定的其他执行。另外, can be ,这意味着当您遇到. IntegerExe2.exec()A.agenullsynchronize(null) {...}
1 ) JLS 不要求表达式.class(参见15.8.2. 类文字)始终返回相同的实例,参见JLS - 12.2。类和接口的加载:
行为良好的类加载器维护这些属性:
- 给定相同的名称,一个好的类加载器应该始终返回相同的类对象。
| 归档时间: |
|
| 查看次数: |
57 次 |
| 最近记录: |