Synchronized内置锁作用的是对象,是一个对象锁。主要是对临界资源起到互斥访问的目的。
同步实例方法,锁是当前实例对象
同步类方法,锁是当前类对象
同步代码块,锁是括号里面的对象
Synchronized锁底层是通过monitor对象来实现对资源的互斥访问,当同一个线程多次加锁时,monitor+1,释放锁就-1,知道为0才能被其他线程加锁访问。
Monitor对象存在于每个Java对象的对象头Mark Word中。
在jdk1.5版本之后,当一个线程对某一个临界资源进行访问时,系统不再会给这个资源直接加一个重量级锁,而是进行了一系列的锁的膨胀与升级过程。
锁的膨胀与升级:
偏向锁:当一个线程访问某个临界资源时,该锁会优先进入偏向模式。即,jvm会认为总是该线程来访问此资源。当该线程再次访问时,可直接申请锁,而不用去做一些同步操作和申请锁的过程。这样就很大程度上减少了资源的访问时间。
轻量级锁:当有另外的线程也去访问该资源时,偏向锁会升级为轻量级锁,但轻量级锁使用于那些线程竞争资源不激烈的场合,即两个或多个线程交替访问或者可以通过自旋锁的优化,在短时间的等待后就可以访问到资源,这时候一般还是轻量级锁加自旋锁配合解决资源的竞争情况。
重量级锁:当多个线程多临界资源有着激烈的竞争时,轻量级锁会膨胀为重量级锁,此时锁将由操作系统底层来实现,执行效率会很慢。
锁只会膨胀升级不会降级。
锁的优化:
锁定消除:jvm在编译阶段,通过逃逸分析的手段,当确定一个共享的资源不存在被竞争的情况时,加在其上的锁就会消除。
**粗体** _斜体_ [链接](http://example.com) `代码` - 列表 > 引用
。你还可以使用@
来通知其他用户。