Syschronized 同步锁
synchronized
它可以把任意一个非 NULL
的对象当作锁。它属于独占式的悲观锁,同时属于可重 入锁。
1. Synchronized 作用范围
- 作用于方法时,锁住的是对象的实例(
this
); - 当作用于静态方法时,锁住的是
Class
实例,又因为Class
的相关数据存储在永久带PermGen
(jdk1.8 则是metaspace
),永久带是全局共享的,因此静态方法锁相当于类的一个全局锁, 会锁所有调用该方法的线程; synchronized
作用于一个对象实例时,锁住的是所有以该对象为锁的代码块。它有多个队列, 当多个线程一起访问某个对象监视器的时候,对象监视器会将这些线程存储在不同的容器中。
2. Synchronized 核心组件
Wait Set
:哪些调用wait
方法被阻塞的线程被放置在这里;Contention List
:竞争队列,所有请求锁的线程首先被放在这个竞争队列中;Entry List
:Contention List
中那些有资格成为候选资源的线程被移动到Entry