多线程编程中用到的几种锁

您所在的位置:网站首页 偏向锁使用场景有哪些特点 多线程编程中用到的几种锁

多线程编程中用到的几种锁

2024-07-17 20:40| 来源: 网络整理| 查看: 265

由于多线程可能同时操作同一块内存的需求出现,多线程编程中出现了临界区这个概念。为了解决这个访问冲突的问题,各种锁应运而生,锁如果以等待线程的运行方式分主要分为自旋锁和互斥锁两类: 自旋锁(spinlock): 是指当一个线程在获取锁的时候,如果锁已经被其它线程获取,那么该线程将循环等待(不会睡眠),然后不断的判断锁是否能够被成功获取,直到获取到锁才会退出循环。 自旋锁是非阻塞锁,一直占用CPU,他在未获得锁的情况下,一直尝试得到锁也就是自旋,所以占用着CPU,如果不能在很短的时间内获得锁,会使CPU效率降低。

互斥锁(mutex): 某个线程要更改共享数据时,先将其锁定,此时资源的状态为“锁定”,其他线程不能更改;直到该线程释放资源,将资源的状态变成“非锁定”,其他的线程才能再次锁定该资源。互斥锁保证了每次只有一个线程进行写入操作,从而保证了多线程情况下数据的正确性。 互斥锁是阻塞锁,当某线程无法获取互斥量时,该线程会被CPU直接挂起,该线程不再消耗CPU时间,当其他线程释放互斥量后,操作系统会激活那个被挂起的线程,让其投入运行。

读写锁(RWLock): 读写锁实际是一种特殊的自旋锁,它把对共享资源的访问者划分成读者和写者,读者只对共享资源进行读访问,写者则需要对共享资源进行写操作。读写互斥,读读共享。 1.多读者可以同时读 2.写者写时不允许读,不允许其他写者写 3.读者读时不允许写者写

还有锁的其他分类:如悲观锁和乐观锁,公平锁和非公平锁。 悲观锁和乐观锁这个概念主要用于数据库高并发的场景: 1.悲观锁的共享资源每次只给一个线程使用,其它线程阻塞,用完后再把资源转让给其它线程。 2.乐观锁对共享资源不会上锁,但是在更新的时候会判断一下在此期间别人有没有去更新这个数据,可以使用版本号机制和CAS算法实现。乐观锁适用于多读的应用类型,这样可以提高数据吞吐量。

公平锁和非公平锁主要在于线程的资源公平性: 1.公平锁按照线程的请求锁顺序来分配共享资源的使用权。 2.非公平锁当开放共享资源时,使用权由其他线程抢占,效率最高但有可能会出现线程饿死。



【本文地址】


今日新闻


推荐新闻


    CopyRight 2018-2019 办公设备维修网 版权所有 豫ICP备15022753号-3