多线程之synchronized关键字

synchronized为Java的互斥锁,也是重量级锁,方法加上synchronized后会带来性能的开销,所以性能和安全性之间要做好平衡。

synchronized锁的范围

  1. 成员方法:
    public synchronized void demo()——属于成员方法,设置的是对象锁,也就是两个线程访问同一个实例对象时,会产生互斥。
//等同
public void demo(){
	synchronized(this){
	
	}
}
  1. 静态方法:
    public static synchronized void demo()——属于类方法,设置的是类锁,也就是两个线程同时访问一个类时,会产生互斥。
//等同
public static demo(){
	synchronized(Demo.class){
	}
}

知识点总结

  1. synchronized的锁标识处于对象头
  2. monitorenter监视器进入->加锁;monitorexit监视器撤出->释放锁
  3. jdk1.6中加入了偏向锁和轻量级锁
  4. 偏向锁是解决的问题是:大多数时候不需要锁的线程或者一个锁多次由一个线程获取,为了减少获取锁的代价,设置了偏向锁,因此偏向锁不用被释放,下次该线程继续访问的时候无需再获取偏向所了,更像一个初级通行证。
  5. 轻量级锁解决的问题是:少量线程竞争同一个资源并且他们的操作时间比较短,因此不需要将线程阻塞(因为阻塞的代价比较大),没有竞争到锁的线程会轮询固定的次数来获取轻量级锁。
  6. 线程阻塞需要CPU从用户态转化为内核态,代价比较大。
  7. synchronized遇到异常时会自动释放锁,并且synchronized不可中断。
  8. synchronized属于悲观锁
发布了56 篇原创文章 · 获赞 3 · 访问量 1171

猜你喜欢

转载自blog.csdn.net/qq_40788718/article/details/103681300