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