volatile修饰,表示一个变量不进行寄存器优化,每次使用必须从内存中读取。
在两个线程间通信的时候,使用这个修饰,可以减少对锁的依赖。这意味着降低死锁的机会,提高效率。
我们假设存在两个线程,A和B。我们在A和B之间建立两条通道,A到B的通道和B到A的通道。
每个通道都有两个状态,当前有货和当前没货。这个状态用volatile来修饰,并确保它的写操作是原子操作。
我们先考虑A到B的通道,考虑通一个,另一个通道就反方向建立起来就可以了。
在A到B的通道中:
- A来检查通道的状态,是否是当前没货。如果是,就把货放到通道里,然后修改通道状态为当前有货。
- B来检查通道的状态,是否是当前有货。如果是,就把货从通道里取出,然后修改通道状态为当前没货。
以上两个步骤因为是在A、B两个线程内同步进行的,所以没有标注顺序号。
用上面的步骤,不论货有多大,多么复杂。他们的读写操作都被这个修饰为volatile的状态给限制在他们应该在的那个线程。
通过分析,我们总结出一个无锁通信的结论:
用volatile的状态检查和原子操作的状态修改,隔离数据读写。虽然现在只是在两个线程间进行通信,不过这个结论,却可以应用到多个线程同时参与的环境。