【发布时间】:2016-05-20 18:45:54
【问题描述】:
我有一个java类如下:
public class Example implements Runnable {
private int num;
...
// Getter
public int getNum(){
return this.num;
}
// Setter
public void addToNum(int amount) {
if (this.amount> 0) {
this.num += amount;
}
}
...
}
这个类可以被多个线程实例化。每个实例都有自己的“num”,也就是说,我不希望在所有实例之间共享“num”变量。
对于每个实例,可以同时访问多个线程以读取/写入“num”变量。那么保护“num”变量上的读/写操作以使其成为原子操作的最佳选择是什么?
我知道如果在 C# 上可以使用如下链接的 lock(object) 来完成,但在 java 中我不知道(我是新手):
【问题讨论】:
-
制作setter方法
addToNum同步 -
您是说
Example实例不会在线程之间共享吗?因为如果是这种情况,那么您就可以了,您不需要添加任何同步或锁定。只有当两个(或更多)线程将访问同一个Example实例时,您才需要考虑它。 -
希望您希望 addToNum() 一次只能由一个线程访问。你不同步那个方法吗?更好的方法是使用同步块
-
因为 num 是私有的,所以不用担心同步
-
if (this.num > 0) {正确吗?对于给定的代码,this.num永远不会增加,因此不存在线程安全问题 :)
标签: java multithreading thread-safety locking atomic