1.synchronized的作用与原理

  • synchronized关键词用来实现锁,由于其由JVM指令隐式实现也被称为隐式锁。JVM使用monitor(监视器锁)来实现同步(synchronized关键字),每一个对象都有一个monitor,一个monitor只能被一个线程拥有。
  • 任意对象及方法上加锁,而加锁的这段代码称为“互斥区”或“临界区”。通过 synchronized保证只有同步代码块的部分可以重排序,排斥未取得锁的线程,保证顺序一致性。

5613468-1e33dc95f118d80e.png

  • 一个对象一个锁,多个线程多个多个锁
    • 每一个对象都有一个monitor(锁),一个monitor只能被一个线程拥有。如果每个线程创建同一个类不同对象,则存在不同对象锁,若操作同一个变量,并不存在互斥性,因为线程所持有的对象锁并不相同。对于非静态static修饰的方法或变量,是一个对象一把锁的。
    • 用static修改的方法或者变量,在该类的所有对象是具有相同的引用的,这样的话,无论实例化多少对象,调用的都是一个方法和变量。

二.synchronized的锁的类型

假设P1、P2是同一个类的不同对象,P1、P2就都可以调用它们。
1.把synchronized当作函数修饰符:它锁定的是调用这个同步方法对象。比如P1调用函数,而对P2而言,P1这个锁与它毫不相干,是两个不同的锁。
2.同步块:锁就是synchronized传入的对象
3.将synchronized作用于static 函数:锁时当前调用这个方法的对象所属的类(Class,而不再是由这个Class产生的某个具体对象了)。

转载自:synchronized锁