并发中锁的分类

13 篇文章 0 订阅

1、自旋锁
线程状态及上下文切换消耗系统资源,当访问共享资源的时间短,频繁切换上下文不值得。jvm使线程在没有获得锁的时候,执行空循环,循环几次之后,如果还没获得锁,再被挂起。

2、阻塞锁
改变了线程的运行状态,让线程进入阻塞状态进行等待,当获得相应的信号(唤醒或者时间)时,才可以进去线程的准备就绪状态,转为就绪状态的所有线程,通过竞争,进去运行状态。

3、重入锁
支持线程再次进入的锁。

4、读写锁
两把锁,读锁和写锁,写写互斥、读写互斥、读读共享

5、互斥锁
同一时刻,只能有一个线程进入。

6、悲观锁
总是假设最坏的情况,每次拿数据的时候都认为别人会修改,所以每次拿数据的时候都会上锁,这样别人想拿这个数据就会被阻塞知道它拿到锁。synchronized是悲观锁。

7、乐观锁
每次去拿数据的时候都认为别人不会修改,所以不会上锁,但是在更新的时候会判断一下在此期间别人有没有去更新这个数据,使用版本号等机制。mysql乐观锁,使用version标记。

8、公平锁
大家都排队。

9、非公平锁
一部分人排队,新来的可能会插队。

10、偏向锁
一直持有锁,等到竞争出现才释放锁的机制,当其他线程尝试竞争偏向锁机制时,持有偏向锁的线程才会释放锁。

11、独占锁
每次只有一个线程能持有锁,与互斥锁一样

12、共享锁
允许多个线程同时获取锁,并发访问,共享资源。读锁。

在MySQL中,(Locking)用于控制并发访问数据库资源以避免数据一致性问题。MySQL支持多种类型的,这些可以分为以下几类: 1. **共享(Shared Locks, S)**: - 允许读取数据,但阻止其他事务对同一行进行写操作。如果多用户同时请求共享,则所有请求都会立即获得。 ```sql SELECT * FROM table WHERE id = 1; -- 获取S ``` 2. **排他(Exclusive Locks, X)**: - 只允许一个事务独占一行,阻止其他事务进行读取或写入操作。 ```sql INSERT INTO table VALUES (1, 'value'); -- 获取X UPDATE table SET column = 'new_value' WHERE id = 1; -- 获取X DELETE FROM table WHERE id = 1; -- 获取X ``` 3. **意向(InnoDB Only, IX)**: - InnoDB存储引擎特有的,用于定表级,允许事务定整个表以便在其范围内进行插入或删除操作。 ```sql LOCK TABLES table WRITE; -- 获取IX ``` 4. **行级乐观(Row-Level Optimistic Locking, ROWX)**: - MySQL的默认行为是行级定,但可以通过`SELECT ... FOR UPDATE`语句实现乐观,它会检查行的版本号是否与先前读取时一致。 5. **死(Deadlocks)**: - 当两个或更多的事务因等待对方释放资源而互相阻塞时,就会发生死。 6. **自旋(Spin Locks)**: - 这不是MySQL的标准机制,而是某些库或优化策略中使用的高级概念,它让进程在获取失败时循环尝试,直到成功。 了解这些的类型有助于管理和优化并发性能,尤其是在高并发环境下。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值