Volatile:与锁相比,Volatile变量是一种非常简单但同时又非常脆弱的同步机制,它在某些情况下降提供优于锁的性能和伸缩性。如果严格遵循volatile的使用条件--即变量真正独立于其他变量和自己以前的值--在某些情况下可以使用volatile代替synchronized来简化代码。然而,使用volatile的代码往往比使用锁的代码更加容易出错。
只有在一些有限的情形下使用volatile变量代替锁。要使volatile变量提供理想的线程安全,必须同时满足下面两个条件:①对变量的写操作不依赖于当前值。②该变量没有包含在具有其他变量的不变式中。
实际上,这些条件表明,可以被写入volatile变量的这些有效值独立于任何程序的状态,包括变量的当前状态。
第一个条件的限制使volatile变量不能用作线程安全计数器。虽然增量操作(x++)看上去类似一个单独操作,实际上它是一个由读取-修改-写入操作序列组成的组合操作,必须以原子方式执行,而volatile不能提供必须的原子特性。实现正确的操作需要使x的值在操作期间保持不变,而volatile变量无法实现这一点。
volatile只能保证变量的安全,不能保证线程的安全。
CopyOnWriteArrayList适合使用在读操作远远大于写操作的场景里,比如缓存。
ReadWriteLock当写操作时,其他线程无法读取或写入操作,而当读操作时,其他线程无法写入数据,但却可以读取数据。适用于读取操作远远大于写入的操作。
ConcurrentHashMap是一个线程安全的Hash Table,它的主要功能是提供了一组和HashTable功能相同但是线程安全的方法。ConcurrentHashMap可以做到读取数据不加锁,并且其内部的结构可以让其在进行写操作的时候能够将锁的粒度保持地尽量地小,不用对整个ConcurrentHashMap加锁。
本文探讨了Volatile变量作为轻量级同步机制的优劣,强调其在特定条件下可替代锁提高性能。深入分析CopyOnWriteArrayList、ReadWriteLock及ConcurrentHashMap在高并发场景下的应用,特别指出它们分别在读多写少、读写分离与高性能哈希表场景的优势。
1161

被折叠的 条评论
为什么被折叠?



