同步与锁

Posted luckysimple

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了同步与锁相关的知识,希望对你有一定的参考价值。

为了避免多个线程同时访问同一个数据而产生不可预料的结果,需要将各个线程对同一数据的访问同步。同步最常见的方法就是用锁。

接下来介绍常用的锁。

二元信号量(Binary Semaphore)

Binary Semaphore是最简单的一种锁,只有两种状态:占用与非占用。适合只能被唯一一个线程独占访问的资源。

多元信号量(简称Semaphore )

Semaphore允许多个线程并发访问资源。初始值为N的信号量允许N个线程并发访问资源。线程访问资源时,将信号量减1;访问完资源后,将信号量加1。当信号量的值为0时,线程进入等待状态。

互斥量(Mutex)

Mutex类似Binary Semaphore。他们的不同在于:

  • 信号量可以被系统的任意线程获取和释放。即同一信号量被一个线程获取之后,可由另一个线程释放;
  • 互斥量要求线程谁获取谁释放。

临界区(Critical Section)

Critical Section是比Mutex更严格的同步方法。

Critical Section和Mutex与Semaphore的区别:

  • Mutex与Semaphore在系统的任何进程都是可见的。即一个进程创建了Mutex或Semaphore,另一个进程获取该锁是合法的;
  • Critical Section的作用范围仅限于本进程,其他进程无法获取该锁。

读写锁(Read-Write Lock)

Read-Write Lock适合读取频繁,偶尔写入的情况。Read-Write Lock有两种获取方式,共享或独占。

条件变量(Condition Variable)

Condition Variable类似一个栅栏。条件变量可以让许多线程一起等待某个事件的发生,当事件发生时(条件变量被唤醒),所有线程都一起恢复运行。

以上是关于同步与锁的主要内容,如果未能解决你的问题,请参考以下文章

Java线程:线程的同步与锁

Java多线程---同步与锁

线程同步与锁

面试官必问java 并发知识总结-同步与锁

面试官必问java 并发知识总结-同步与锁

Java多线程-线程的同步与锁