我想知道这个表达式是否正确,如果它意味着:我对字段状态进行了写锁定,而不是更改它.如果没有,我想知道参数的含义是什么,因为我总是这样看.
public class Example {
private int status;
public Example(int status){
this.status = status;
}
public void setStatus(int newStatus){
synchronized(this.status){
this.status = newStatus;
}
}
}
Run Code Online (Sandbox Code Playgroud)
这段代码有几个问题:
你不能synchronize在一个原始的.
你可以把它改成一个Integer,但见下文.
在非最终对象上同步不是一个好主意.
你可以做到 final
在一个字段synchronized开启时更改字段将以一些非常模糊的方式中断.而现在它是final不允许的.
可能更好地在另一个领域同步.
您还应该提供完整性的get方法.
修复了所有这些问题,您的代码看起来像这样:
public class Example {
private final Object statusLock = new Object();
private Integer status;
public Example(Integer status) {
this.status = status;
}
public void setStatus(Integer newStatus) {
synchronized (statusLock) {
status = newStatus;
}
}
public Integer getStatus() {
return status;
}
}
Run Code Online (Sandbox Code Playgroud)
现在 - 使用此代码 - 您的问题的答案是那样的.这里发生的是当您更改其值时,通过set方法从任何其他线程锁定对该字段的所有访问.status
请注意,我没有在get方法中进行同步.如果我这样做,那么上述陈述就会改变.
| 归档时间: |
|
| 查看次数: |
411 次 |
| 最近记录: |