Synchronized详解

线程安全的阻塞式解决方案——Synchronized,俗称对象锁,采用互斥的方式让同一时刻最多只有一个线程持有对象锁,其它线程在想获取锁时只能被阻塞住。这样就能保证持有锁的线程能够安全的执行操作有共享资源的代码啦

synchronized原理

在java中,每一个对象有且仅有一个同步锁。这也意味着,同步锁是依赖于对象而存在。
当我们调用某对象的synchronized方法时,就获取了该对象的同步锁。例如,synchronized(obj)就获取了“obj这个对象”的同步锁。
不同线程对同步锁的访问是互斥的。也就是说,某时间点,对象的同步锁只能被一个线程获取到!通过同步锁,我们就能在多线程中,实现对“对象/方法”的互斥访问。 例如,现在有两个线程A和线程B,它们都会访问“对象obj的同步锁”。假设,在某一时刻,线程A获取到“obj的同步锁”并在执行一些操作;而此时,线程B也企图获取“obj的同步锁” —— 线程B会获取失败,它必须等待,直到线程A释放了“该对象的同步锁”之后线程B才能获取到“obj的同步锁”从而才可以运行。
其实,加锁和释放锁等都是由字节码中管程(monitor)控制的,以后填坑这部分知识。

可以用在的地方

  • 实例方法
  • 实例方法中的代码块
  • 静态方法
  • 静态方法中的代码块

我的理解

synchronized修饰实例方法是对类的当前实例进行加锁,防止其他线程同时访问该类的该实例的所有synchronized块, 类的两个不同实例就没有这种同步约束;

synchronized修饰实例方法,如果一个线程获得和对象锁,线程在调用其它用synchronized修饰的方法时会直接执行,不会等待继续获取锁 ,这是重入锁

synchronized修饰静态方法对类进行加锁,限制多线程同时访问该类的所有实例

你可能感兴趣的:(Synchronized详解)