synchronized原理
  • Java中,每个对象有且仅有一个同步锁.即同步锁是依赖对象而存在的
  • 调用某个对象的synchronized方法时,就获取了该对象的同步锁
  • 不同线程之间对同步锁的访问是互斥的:
    • 某个时间点,对象的同步锁只能被一个线程获取
    • 通过使用同步锁,就可以在多线程中,实现对象或者方法的互斥访问
synchronized基本规则
  • 第一条: 当一个线程访问某对象synchronized方法或者synchronized代码块时,其余线程对该对象该synchronized方法或者该synchronized代码块的访问将被阻塞
  • 第二条: 当一个线程访问某对象synchronized方法或者synchronized代码块时,其余线程可以访问该对象非同步代码块
  • 第三条: 当一个线程访问某对象synchronized方法或者synchronized代码块时,其余线程对该对象其余synchronized方法或者其余synchronized代码块的访问将被阻塞
synchronized方法
  • synchronized修饰的方法叫作synchronized方法
public synchronized void runs() {
	...
}
synchronized代码块
  • synchronized修饰的代码块叫作synchronized代码块
public void runs() {
	synchronized (this) {
		...
	}
}
  • synchronized代码块中的this指代当前对象,即获取当前对象的同步锁. 也可以换成其余对象
  • synchronized代码块可以更精确控制冲突访问区域,使用效率更高
全局锁
  • 全局锁:
    • 全局锁是指类的锁
    • 无论实例化多少个对象,线程都共享该锁
    • 全局锁对象的就是static synchronized. 或者是锁在该类的class或者classloader对象上
实例锁
  • 实例锁:
    • 锁在一个实例对象上面
    • 如果该类是单例,那么该锁也具有全局锁的概念
    • 实例锁对应的就是synchronized关键字