20170206-多线程同步volatile与ConditionVariable

多线程同步

201612

  • volatile

对于volatile修饰的变量,jvm虚拟机只是保证从主内存加载到线程工作内存的值是最新的。

例如假如线程1和线程2同时在进行read,load操作中,发现主内存中count的值都是5,那么都会加载这个最新的值。在线程1对count进行修改之后,会write到主内存中,主内存中的count变量就会变为6,线程2由于已经进行read,load操作,在进行运算之后,也会更新主内存count的变量值为6,导致两个线程即使用volatile关键字修改之后,还是会存在并发的情况。

  • ConditionVariable

Android封装的锁对象,以它本身为同步对象,所以ConditionVariable的对象,不要调用wait()和notify(),而是采用如下的方法:

构造函数:

  • 1.无参的,默认创建时close状态
  • 2.带参数boolean,参数代表初始状态,true是open,false是close。

open(): 将状态设置为打开,释放所有blocked的线程,相当于notifyAll()。在此函数之后调用block()是无效的,除非调用close()函数。

block(): block当前线程直至状态打开(即调用open()),相当于wait()。如果此时是打开状态该函数不生效,立即返回。

close(): 将状态设置为关闭,调用后任何调用block()的线程将会block直至被调用了open()。
也就是说,如果想block()某些操作,那就先close(),block()部分处理完之后再open()。

你可能感兴趣的:(20170206-多线程同步volatile与ConditionVariable)