面试题:线程同步的方式有哪些?
我的回答:
多线程同时访问和修改某个数据的话,会造成数据的不一致和冲突问题,所以就需要线程同步,线程同步的方式有:
1.互斥锁
互斥锁就是,当一个资源被访问和操作时,会对这个资源加锁,把这个资源锁定,其他线程不能对其进行操作。直到上一个线程操作完成之后,会释放互斥锁,其他资源才可以进行操作。
2.信号量
信号量是互斥锁的扩展。允许多个线程同时访问同一个资源,当信号量大于1时,可以对资源进行访问;信号量为0时,其他线程阻塞。信号量为几,代表可以同时几个线程访问该资源。
3.条件变量
线程可以睡眠等待,而不是忙等待,这样可以节约CPU的资源。等某个条件成立的时候,线程再被唤醒。
4.读写锁
多个线程可以同时读取同一个数据,但是只允许一个线程对其进行写操作。读写锁适用于读多写少的场景。
5.自旋锁
类似于互斥锁。当资源被锁定之后,其他线程会在一个循环中等待,直到锁被释放。自旋锁适用于锁被持有时间较短的场景。
6.原子操作
确保某个操作是在单个步骤中完成,不会被其他线程所干扰。一般由硬件支持。
7.栅栏
就是允许多个线程等待,直到所有的线程都到达一个点之后,再同时执行。
8.事件
线程等待某个事件发生时,某个事件被触发了,等待的线程会被唤醒。