4. 线程同步的方式✭✭✩✩✩
想想线程的特点,因为不同线程会共享资源。比如:同一个账户,A线程读,B线程取,这样可能会发生冲突,所以需要同步来避免麻烦。
竞争的方式有两种:代码竞争和数据竞争。代码竞争指多线程环境下,同一时刻两个线程都在同一段代码上。数据竞争指的是两个线程同时访问一个数据。
线程同步是两个或多个共享关键资源的线程的并发执行。同步的作用就是避免关键资源的使用冲突。
同步的方式:(4种)
-
临界区(Critical section):通过对多线程的串行化来访问公共资源或一段代码,速度快,适合控制数据访问。在任何时候只允许一个线程访问共享资源,如果有多个线程访问,那么当有一个线程进入后,其他试图访问共享资源的线程将会被挂起,并且等到进入临界区的线程离开,临界在被释放后,其他线程才可以抢占。
-
互斥量(Mutex):为协调对一个共享资源的单独访问而设计。互斥量只有一个,只有拥有互斥量的线程,才有权限去访问系统的公共资源,保证资源不会被多个线程访问。互斥不仅能实现同一个应用程序的公共资源安全共享,还能实现不同应用程序的公共资源安全共享。
比如 Java 中的 synchronized 关键词和各种 Lock 都是这种机制。
-
信号量(Semphore):为控制一个具有有限数量的用户资源而设计。它允许多个线程在同一时刻去访问同一个资源,但一般需要限制同一时刻访问此资源的最大线程数目。
-
事件(Event):用来通知线程有一些事件已发生,从而启动后继任务的开始。
网友评论