java多线程的锁机制

源于蚂蚁课堂的学习,点击这里查看(老余很给力) 

悲观锁和乐观锁

悲观锁:
    只要进行操作就会对当前的操作上锁,即悲观的认为此次操作可能会出现线程安全,故主动加锁处理。
    如:sync和lock

乐观锁:
    不会对数据上锁,而且通过将实际的数据与预期的数据进行比较,查到后做数据的变动。
    如:cas机制、数据库表的version

阻塞和非阻塞

阻塞:
    会产生线程等待问题,当持有锁的线程处理数据时,其他线程想要访问这个数据,只能等锁的释放。

非阻塞:
    不会线程等待,在线程访问数据时,通过值的比较去判断操作是否可行,期间其他线程可以做其他事情,也可以
自旋重试。

sync

重量级锁,即会产生线程等待,也是一种悲观锁,具有可重入性(同一个对象的多个方法之间可传递)、可见性和原子性。
由于其会阻塞线程,故效率较低

lock

需要我们手动控制锁的创建、使用和释放,是一种轻量级锁、悲观锁

其中lock锁支持:
可重入锁 ReentrantLock 锁的传递
读写锁 ReentrantReadWriteLock

cas无锁机制 

一种乐观锁,本质上不会锁定对象,而是通过本地内存(也就是工作内存)中存放全局变量副本数据的值与主内存的数据值比较,
相同的话,去做数据的更新,不同的话,会将主内存的值刷新至本地内存,再次去请求比较,直到成功,即自旋

原子类 

atomic类,底层都是采用乐观锁CAS机制去实现线程安全控制的

猜你喜欢

转载自blog.csdn.net/yxh13521338301/article/details/106231372