原子操作及线程同步

为了提高性能,在读或写原子数据的时候,应该避免使用同步,这个是非常危险而且错误的,原因参见线程同步的第二条

 原子操作

atomic原子操作是CPU执行指令的最小单元,是指不会被线程调度机制打断的操作;这种操作一旦开始,就一直运行到结束,在执行完毕之前不会被任何其它任务或事件中断。能够在单条指令中完成的操作都可以认为是" 原子操作",因为中断只能发生于指令之间。通常所说的原子操作包括对非longdouble型的primitive进行赋值,以及返回这两者之外的primitive。如果你在longdouble前面加了volatile,那么它就肯定是原子操作了。

 

线程同步

synchronized作用:

1. 互斥:保证一个线程里所看到的都是同一状态,不会出现一个线程执行过程中,共享数据被其他线程修改,引起状态转变,导致一个线程前后看到的东西处于不一致的状况。

2. 同步:保证在一个线程里所做的修改能够被其他线程所看到,避免由于JVM做如下代码优化,所导致多线程不能同步的问题。

    while(!done)

        i++;

JVM优化代码后转换成

    if(!done)

        while(true)

            i++;

    这样的话在另外一个线程修改了done可能会导致while循环永远不会退出,如果使用了synchronized,则不会做此优化,避免了此类问题的发生。

 

总结:当多个线程共享可变数据的时候,每个读或者写数据的线程都必须执行同步。如果只是为了同步(通信),而不是互斥访问,可以用volatile修饰变量,而不用synchronized方法,它可以保证在一个线程中读取的数据都是最新修改的,这样做可以提高性能,因为系统做同步的开销很大。

猜你喜欢

转载自blog.csdn.net/ljyss9/article/details/68927917
今日推荐