多线程并发-synchronized

来源:互联网 发布:nba总决赛数据2016 编辑:程序博客网 时间:2024/05/22 00:45

同步方式

  1. synchronized同步方式主要有3种,简单介绍如下:
    1.1. synchronized同步普通方法,锁是当前对象实例。
    1.2. synchronized同步静态方法,锁是当前类的Class对象。
    1.3 synchronized同步代码块,锁是代码块中的括号里的对象。

同步原理

  1. synchronized在JVM中是使用Monitor对象来实现对方法和代码块的同步。只是各自实现原理不一样。
  2. 任何一个对象都会与monitor对象关联,线程获得Monitor对象,就获得该对象的锁。
  3. 对于同步代码块,JVM使用monitor的Monitorenter指令和monitorexit指令来实现同步代码块。
  4. mointorenter指令是在编译后进入到同步代码块开始位置,monitorexit是在同步代码块结束和异常位置。JVM保证这对指令必须成对出现。

轻量级锁

  1. 轻量级锁是JDK1.6之后加入的,轻量级锁是 相对于 使用操作系统互斥量来实现锁,这种方式成为重量级锁
  2. 轻量级锁本意是在没有多线程前提下,减少传统重量级锁带来的性能消耗。这句话的意思应该是以前使用synchronized修饰方法时,底层使用重量级锁。即使某一段时间没有多线程访问。
  3. 对象头:在HotSpot虚拟机里面,每个java对象头都分为两部分,第一部分是存储对象自身运行时的数据,称之为Mark Word;第二部分是存储指向方法区对象类型的指针,如果是数组的话,还有一个额外的空间存储数组的长度。对象头中Mark Word存储内容如下:
    这里写图片描述
  4. 轻量级锁获取流程:
    轻量级锁过程
  5. 轻量级锁依据:轻量级锁性能提升是一个经验数据,是没有多线程对锁竞争的条件下,没有竞争,轻量级锁使用CAS操作避免同步互斥开销。如果有多线程竞争,轻量级锁不仅仅要CAS操作还要使用互斥量,甚至比重量级锁更慢!

偏向锁

  1. 偏向锁是为了消除数据在没有多线程竞争的条件下,完全消除同步动作,进一步提供程序的运行性能。轻量级锁是在没有多线程竞争条件下,使用CAS消除使用操作系统互斥带来的影响。而偏向锁,不仅是为了消除同步动作,甚至连CAS操作都要取消。
    这里写图片描述
  2. 偏向锁的设计主要是提高带有同步但是没有竞争的程序性能,即程序虽然使用同步方式,但是实际运行过程中并没有竞争情况发生。
  3. 偏向锁不是一直都是对程序有利的,如果程序中大多数锁都是多线程竞争,其实偏向锁是多余的。有的场景下,可以使用-XX:-UseBiasedLocking禁止使用偏向锁
阅读全文
0 0
原创粉丝点击