ef2*_*011 3 java performance multithreading atomicity
在像Android这样的多线程环境中,一个简单的int变量可能被多个线程操纵,在哪些情况下仍然有理由使用int一个数据成员?
一个int作为局部变量,不限于具有到它的独占访问的方法的范围内(并因此启动&修改它的完成是总是在相同的线程),非常有意义的性能代价.
但作为数据成员,即使由访问器包装,它也会遇到众所周知的并发交错修改问题.
所以看起来"玩得安全"可以全面使用AtomicInteger.但这看起来非常低效.
你能带一个线程安全int数据成员用法的例子吗?
有没有理由不总是使用AtomicInteger作为数据成员?
是的,有充分的理由不总是使用AtomicInteger. AtomicInteger由于volatile构造比局部int和其他Unsafe构造用于设置/获取基础int值,因此可以至少慢一个数量级(可能更多). volatile表示每次访问时都会跨越内存屏障,AtomicInteger这会导致高速缓存内存在相关处理器上刷新.
此外,仅仅因为您已经使所有字段AtomicInteger都不能保护您在访问多个字段时不受竞争条件的影响.只是有无可替代的制作有关何时使用正确的决定volatile,synchronized以及Atomic*类.
例如,如果您希望在线程程序中以可靠的方式访问类中的两个字段,那么您将执行以下操作:
synchronized (someObject) {
someObject.count++;
someObject.total += someObject.count;
}
Run Code Online (Sandbox Code Playgroud)
如果这两个成员AtomicInteger当时你要访问volatile两次,那么跨越2个内存障碍而不只是1.此外,分配比Unsafe内部操作更快AtomicInteger.此外,由于两个操作的数据竞争条件(与synchronized上面的块相反),您可能无法获得正确的值total.
你能带一个线程安全的int数据成员用法的例子吗?
除了标记或使用之外,final没有机制可用于线程安全的int数据成员.没有神奇的方法可以在所有字段上绘制线程安全性.如果有,那么线程编程将很容易.挑战在于找到适合放置积木的地方.找到应标记的正确字段.找到合适的地方和朋友.volatileAtomicIntegersynchronizedvolatileAtomicInteger
| 归档时间: |
|
| 查看次数: |
1334 次 |
| 最近记录: |