java 中的原子操作
(automic operation)原子操作是指不会被线程调度机制打断的操作;这种操作一旦开始,就一直运行倒结束,中间不会有任何 context switch (切换到另一个线程)。通常所说的原子操作包括对非long和double型的primitive进行赋值,以及返回这两者之外的primitive。之所以要把它们排除在外是 因为它们都比较大,而JVM的设计规范又没有要求读操作和赋值操作必须是原子操作(JVM可以试着去这么作,但并不保证)。不过如果你在long或 double前面加了volatile,那么它就肯定是原子操作了。
原子操作只有对基本类型进行读取或赋值操作时才会被认为是安全的。 也就是说在多线程共享资源的使用时,只有前面所指的两种情况可以不使用同步,其他都必须使用同步,java 基本类型 long 和 double 可以使用volatile 关键字来将其赋值和返回操作转为原子操作。
所以在多线程开发时,最安全的两个方针:
1 如果你要对类的某个方法进行同步,那么最好同步所有 的方法。
2 去除方法的同步控制时,要十分小心。通常这么做是因为性能的有瓶颈时,最好利 用性能评价工具证实。