美文网首页
thread数据同步

thread数据同步

作者: tiancijiaren | 来源:发表于2017-04-11 21:27 被阅读0次

    #Atomic定义:

    atomic一词与“原子(atom)”有关,曾被认为是物质最小的单元,不能再被拆分为更小的部分。当陈旭被认为是atomic的时候,他就不能在运行中途被中断。这可由硬件或软件模拟来完成。

    #Volatile:

    Java将(除long、double)变量的基本加载与存储定义为atomic。这意味着变量的值在存储的时候不会有中间的状态显现,变量也不会再加载到寄存器的中途被改变。

    很不幸的,Java的内存模型却更复杂一点。Thread被允许能够在local  memory(例如机器的寄存器)中持有变量的值。在这种情况下,当某thread改变该变量的值时,另一个thread可能不会察觉变量的变化。这种情况在循环是由变量来控制的时候特别容易出现。

    解决这个问题的一个办法是对该变量提供setter和getter,并通过synchronized在这些method上就可以将其访问同步化。此方法可行是因为取得同步化的lock代表所有暂时存储于寄存器的值都会被清空到主寄存器中。

    Java提供了更优雅的解决方式:使用volatile关键字。如果变量被标识为volatile,每次使用该变量时都必须从主寄存器中读取;相同的每次写入变量时,值都必须存入主寄存器。指定volatile的变量加载与存储都是atomic的,无论是否是long或double。

    #Barrier(屏障):

    是多个thread的集合点:所有的thread都应该到齐在这个barrier之后才能允许他们继续下去。

    #Condition variable(条件变量):

    实际上不是一个lock,它是与摸个lock有关联的变量。条件变量通常使用在数据同步的环境中,它通常可以完成与Java的等待与通知机制相同功能的API。在那种机制中,条件变量实际上是它所保护的对象lock。

    #Critical section(临界区):

    临界区是synckronized method或block。是由windows提供作为轻量化版本的lock。

    #Event variable(事件变量):是条件变量的另一个名称。

    #Lock(锁):

    lock不是和对象的特定instance有关联就是和特定class有关联。

    每次只有一个thread可以获取到mutex:如果有两个thread试着要获取mutex,只有其中一个会成功,另外一个必须等到第一个thread释放掉lock后才能获取它并继续执行操作。

    在Java中每个对象都有一个关联的lock。当某个method被声明为synchronized的时候,要执行的thread必须要在执行前能够获取该对象的lock。Method完成时lock会自动被释放。

    #Mutex(互斥):lock的另一个名称

    #Semaphore(信号量):与lock类似,在Java中,信号量基本上是跟着计数器的lock。

    #Synchronized  method 与Synchronized(obj)的区别

    Synchronized  method是使用类对象作为锁对象来同步的,在类中多个函数有synchronized参数,那这些函数都不可以同时运行。

    Synchronized(obj)可以使用不同obj实例作为锁对象,这样多个函数可以互相不影响的同步运行。

    相关文章

      网友评论

          本文标题:thread数据同步

          本文链接:https://www.haomeiwen.com/subject/kuwgvttx.html