Xtr*_*oce 5 java concurrency multithreading parameter-passing
我想知道在处理Java中的成员参数时,线程安全是否已经起作用.
假设您有一个API方法
boolean moreThanTen(long value) {
if(value > 10) return true;
else return false;
}
Run Code Online (Sandbox Code Playgroud)
这种方法是线程安全的吗?
我想它会因为每个线程都有自己的局部变量堆栈,而基元都存储在这个本地堆栈中.
唯一让我不确定的是,a long将是两个单独的读取,因此通常不是线程安全的.
我的问题是:我可以确定方法的参数是否以原子方式复制?因此,当使用原语作为参数(偶数float/ long)时,我可以确定在将其复制到局部变量时,线程安全性不会成为问题吗?
谢谢.
要使线程不安全,方法需要允许多个线程访问共享资源(例如,字段).
在您的示例中,没有共享资源(java按值传递参数),因此该方法不能是不安全的.
这个是不安全的,因为threshold可以从多个线程访问,并且对变量的访问没有正确同步:
threshold在被另一个线程更新时可能正在读取该变量,这可能导致读取不一致(长写不保证是原子的); 和threshold由于缺少同步,可能无法从另一个线程向一个线程写入变量,这可能导致第二个线程读取过时值.private long threshold; //mutable, may change
boolean moreThanThreshold(long value) {
return value > threshold; //side comment: cleaner than your if/else
}
void setThreshold(long t) { this.threshold = t; }
Run Code Online (Sandbox Code Playgroud)
| 归档时间: |
|
| 查看次数: |
649 次 |
| 最近记录: |