synchronized为Java的互斥锁,也是重量级锁,方法加上synchronized后会带来性能的开销,所以性能和安全性之间要做好平衡。
synchronized锁的范围
- 成员方法:
public synchronized void demo()——属于成员方法,设置的是对象锁,也就是两个线程访问同一个实例对象时,会产生互斥。
//等同
public void demo(){
synchronized(this){
}
}
- 静态方法:
public static synchronized void demo()——属于类方法,设置的是类锁,也就是两个线程同时访问一个类时,会产生互斥。
//等同
public static demo(){
synchronized(Demo.class){
}
}
知识点总结
- synchronized的锁标识处于对象头
- monitorenter监视器进入->加锁;monitorexit监视器撤出->释放锁
- jdk1.6中加入了偏向锁和轻量级锁
- 偏向锁是解决的问题是:大多数时候不需要锁的线程或者一个锁多次由一个线程获取,为了减少获取锁的代价,设置了偏向锁,因此偏向锁不用被释放,下次该线程继续访问的时候无需再获取偏向所了,更像一个初级通行证。
- 轻量级锁解决的问题是:少量线程竞争同一个资源并且他们的操作时间比较短,因此不需要将线程阻塞(因为阻塞的代价比较大),没有竞争到锁的线程会轮询固定的次数来获取轻量级锁。
- 线程阻塞需要CPU从用户态转化为内核态,代价比较大。
- synchronized遇到异常时会自动释放锁,并且synchronized不可中断。
- synchronized属于悲观锁