thread数据同步

2017-04-11  本文已影响0人  tiancijiaren

#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实例作为锁对象,这样多个函数可以互相不影响的同步运行。

上一篇下一篇

猜你喜欢

热点阅读