并发操作之——java多线程常用的锁

并发操作

并发操作之——java多线程常用的锁


并发操作之——java多线程常用的锁

  • 并发操作
  • 前言
  • 一、共享锁
  • 二、互斥锁
  • 三、死锁
  • 1、偏向锁
  • 2、轻量锁
  • 3、重量级锁
  • 总结


前言

并发操作之——java多线程常用的锁。


一、共享锁

也叫S锁/读锁,能查看但无法修改和删除的一种数据锁,加锁后其它用户可以并发读取、查询数据,但不能修改,增加,删除数据,该锁可被多个线程所持有,用于资源数据共享
并发操作之——java多线程常用的锁_第1张图片

二、互斥锁

也叫X锁/排它锁/写锁/独占锁/独享锁/ 该锁每一次只能被一个线程所持有,加锁后任何线程试图再次加锁的线程会被阻塞,直到当前线程解锁。例子:如果 线程A 对 data1 加上排他锁后,则其他线程不能再对 data1 加任何类型的锁,获得互斥锁的线程即能读数据又能修改数据
并发操作之——java多线程常用的锁_第2张图片

三、死锁

两个或两个以上的线程在执行过程中,由于竞争资源或者由于彼此通信而造成的一种阻塞的现象,若无外力作用,它们都将无法让程序进行下去。

并发操作之——java多线程常用的锁_第3张图片

下面三种是Jvm为了提高锁的获取与释放效率而做的优化 针对Synchronized的锁升级,锁的状态是通过对象监视器在对象头中的字段来表明,是不可逆的过程,

1、偏向锁

一段同步代码一直被一个线程所访问,那么该线程会自动获取锁,获取锁的代价更低。
并发操作之——java多线程常用的锁_第4张图片

2、轻量锁

当锁是偏向锁的时候,被其他线程访问,偏向锁就会升级为轻量级锁,其他线程会通过自旋的形式尝试获取锁,但不会阻塞,且性能会高点
并发操作之——java多线程常用的锁_第5张图片

3、重量级锁

当锁为轻量级锁的时候,其他线程虽然是自旋,但自旋不会一直循环下去,当自旋一定次数的时候且还没有获取到锁,就会进入阻塞,该锁升级为重量级锁,重量级锁会让其他申请的线程进入阻塞,性能也会降低
并发操作之——java多线程常用的锁_第6张图片

总结

JAVA多线程常见的几种锁。

你可能感兴趣的:(面试,并发,java,多线程,锁,双重加锁)