首页 > 技术文章 > synchronized内置锁的介绍

fc520 2019-10-23 19:55 原文

 

重要的网址

1. https://www.cnblogs.com/charlesblc/p/5994162.html synchronized锁的优化过程很全面

2. https://www.cnblogs.com/skywang12345/ 系列教程

一、什么是synchronized?

synchronized是Java提供的一个并发控制的关键字,作用于对象上。主要有两种用法,分别是同步方法(访问对象和clss对象)和同步代码块(需要加入对象),保证了代码的原子性和可见性以及有序性,但是不会处理重排序以及代码优化的过程,但是在一个线程中执行肯定是有序的,因此是有序的。

二、synchronized的基本原理

原理是借用对象markword中的标记以及monitor监控器生成monitorEnter以及monitorExit指令以及对应的计数器。

三、jdk1.6之后的synchronized

在jdk1.6之前,synchronized是非常重量级的,因为它会无时无刻进行锁住对象,而不考虑到程序实际的竞争情况,大多数程序在都是进行交替执行,也就是说不存在资源的竞争,如果没有竞争,但是加锁,加锁和解锁是非常耗费性能的,(重量级)因为线程之间的切换以及线程从内核态到用户态的时间是耗费性能的。

在jdk1.6之后,sun公司对synchronized进行了大幅度的优化,现在采用偏向锁+(轻量级锁+cas)+重量级,之间通过锁碰撞进行切换。

 

 

 以上是锁的膨胀过程,但是可能不正确。

 三、为什么说sychronized是基于jvm的

访问互斥
JVM 通过对象锁来实现互斥:

  1.  
    typedef struct object {
  2.  
    uintptr_t lock;
  3.  
    Class *class;
  4.  
    } Object

同步协作
协作是通过 Object wait, notify/notifyAll 方法实现的。
对应到JVM 的底层术语,这一机制叫做 monitor:

 四、与lock的简单对比

 

推荐阅读