线程同步

来源:互联网 发布:淘宝婴童装主营怎么写 编辑:程序博客网 时间:2024/05/16 19:39

           多个线程同时访问1个数据时,如果只有读操作没有写操作可以不同步,如果写和读同时交互,就需要加锁,对数据进行同步,如STL容器是线程安全的,可以不考虑,除了少部分情况下还是有问题的。

1.使用特殊域变量(volatile)实现线程同步   

    a.volatile关键字为域变量的访问提供了一种免锁机制, 
    b.使用volatile修饰域相当于告诉虚拟机该域可能会被其他线程更新, 
    c.因此每次使用该域就要重新计算,而不是使用寄存器中的值 
    d.volatile不会提供任何原子操作,它也不能用来修饰final类型的变量
2.同步锁代码块
    临界区等,保护代码块的完整执行
3.信号开关同步(lock、unlock)
    a.平行线程
        同步,一先一后的执行代码wait+reset-->signal
           
        死锁,各自等待
              
    b.主从(父子)关系线程
        父子线程,在多连接的服务器上,很普遍,同步机制也比较复杂,和一般的线程同步不同,父子线程中,由于要求高的连接数,需要父线程尽量少的阻塞。如下图,一个线程中生成另外两个线程,其中的写或读的关键点已标出,需要volatile变量标记,使主线程在整个循环中,只有变量标记为阻塞时阻塞。
          
     

    结论:
      基于代码块的读写加锁,是线程同步中最方便、和通用的做法

0 0
原创粉丝点击