Java锁相关及synchronized关键字

Java中锁的概念

自旋锁:为了避免放弃CPU执行时间,循环的使用CAS技术对数据进行尝试更新,直至成功。数组

悲观锁:假定会发生并发冲突,同步全部共享数据的相关操做,从读书据就开始上锁。并发

乐观锁:假定没有冲突,在修改数据时若是发现数据和以前获取的不一致,则读取最新数据,而后重试修改。优化

独享锁(写):给资源加上写锁,线程能够修改资源,其它线程不能再加锁;(单写)spa

共享锁(读):给资源加上读锁后只能读不能改,其余线程也只能加读锁,不能加写锁;(多读)线程

可重入锁、不可重入锁:线程拿到一把锁以后,能够自由进入同一把锁同步的其余代码,则为可重入锁;不然是不可重入锁。对象

公平锁、非公平锁:争抢锁的顺序,若是是按先来后到,则为公平锁;不然是非公平锁。blog

 

Java中几种重要的锁的实现方式:synchronized、ReentrantLock、ReentrantReadWriteLock内存

 

同步关键字synchronized

属于最基本的线程通讯机制,基于对象监视器实现的。资源

Java中的每一个对象都与一个监视器相关联,一个线程能够锁定或解锁监视器。同步

一次只有一个线程能够锁定监视器。

试图锁定该监视器的其余线程都会被阻塞,直到他们能够得到该监视器上的锁定为止。

特性:可重入、独享锁、悲观锁

 

锁的范围:类锁、对象锁

JVM优化:锁消除、锁粗化

提示:同步关键字,不只是实现同步,根据JVM规范还能保证可见性(读取最新内存数据,结束后写入主内存)

 

同步关键字加锁原理:

Java对象头:

  若是对象是数组类型,则虚拟机用3个Word(字宽)存储对象头,若是对象是非数组类型,则用2字宽存储对象头。在32位虚拟机中,一字宽等于四字节,即32bit。

运行期Mark World 根据锁的不一样状态而可能的存储结构以下图:

    对象mark word里面 包含四种状态tag( 00 01 10 11 )
    01 无锁    00 轻量锁     10 重量锁    11 GC废弃

 

 

 同步关键字,优化内容(JDK1.6以后,即锁的升级过程):

  1.偏向锁,JVM默认开启,可使用参数关闭(减小在无竞争状况,JVM资源消耗)

  2.出现两个及以上的线程争抢,则升级——>轻量级锁(CAS修改状态)
  3.线程CAS自旋必定次数以后,升级为重量级锁(对象的mark word 内部会保存一个监视器锁的一个地址)

锁升级过程示意图以下:

偏向锁示意图:

轻量级锁示意图:

重量级锁示意图:

Monitor构造以下图所示:

 

相关文章
相关标签/搜索