java多线程的锁机制
程序员文章站
2022-05-04 18:19:01
...
悲观锁和乐观锁
悲观锁:
只要进行操作就会对当前的操作上锁,即悲观的认为此次操作可能会出现线程安全,故主动加锁处理。
如:sync和lock
乐观锁:
不会对数据上锁,而且通过将实际的数据与预期的数据进行比较,查到后做数据的变动。
如:cas机制、数据库表的version
阻塞和非阻塞
阻塞:
会产生线程等待问题,当持有锁的线程处理数据时,其他线程想要访问这个数据,只能等锁的释放。
非阻塞:
不会线程等待,在线程访问数据时,通过值的比较去判断操作是否可行,期间其他线程可以做其他事情,也可以
自旋重试。
sync
重量级锁,即会产生线程等待,也是一种悲观锁,具有可重入性(同一个对象的多个方法之间可传递)、可见性和原子性。
由于其会阻塞线程,故效率较低
lock
需要我们手动控制锁的创建、使用和释放,是一种轻量级锁、悲观锁
其中lock锁支持:
可重入锁 ReentrantLock 锁的传递
读写锁 ReentrantReadWriteLock
cas无锁机制
一种乐观锁,本质上不会锁定对象,而是通过本地内存(也就是工作内存)中存放全局变量副本数据的值与主内存的数据值比较,
相同的话,去做数据的更新,不同的话,会将主内存的值刷新至本地内存,再次去请求比较,直到成功,即自旋
原子类
atomic类,底层都是采用乐观锁CAS机制去实现线程安全控制的
上一篇: 三国人物张任生平简介:清代的《汉州志》对张任是怎样记载的?
下一篇: Java多线程中断机制