Synchronized解释
1、Java 中的每个对象都有一个锁或者叫做监视器(monitor) ,当访问某个对象的 synchronized 方法时, 表示将该对象上锁 ,此时其他任何线程都无法再去访问该 synchronized 方法了, 直到之前的那个线程执行方法完毕后 ( 或者是抛出了异常) ,将该对象的锁释放掉,其它线程才有可能再去访问该 synchronized 方法。
2、Synchronized:是同步关键字,对需要锁定的资源加上该关键字,即为同步监视器。Synchronized 准确的解释,线程间的互斥。
3、当 synchronized 关键字修饰一个方法的时候,该方法叫做同步方法、互斥区或临界区。
4、当某个对象用synchronized修饰时,表示该对象在任意时刻只能有一个线程访问
5、如果某个 synchronized 方法是 static 的,那么当线程访问该方法时,它锁的并不是synchronized 方法所在的对象, 而是 synchronized 方法所在的对象所对应的 Class 对象,因为 Java 中无论一个类有多少个对象,这些对象会对应唯一一个 Class 对象,因此当线程分别访问同一个类的两个对象的两个 static、synchronized 方法时,他们的执行顺序也是顺序的,一个线程先去执行方法,执行完毕后另一个线程才开始执行。
6、synchronized保证共享数据操作的完整性
7、锁释放
1)出现异常时,锁自动释放
2)当在synchronized块中遇到break,return或抛出exception。则自动释放对象锁。
8、对象锁的同步和异步
同步Synchronized
同步的概念就是共享,如果不是共享的资源,就没有必要进行同步,也就是没有必要进行加锁。
同步的目的就是为了线程的安全,需要满足两个最基本的特性:原子性和可见性。
异步Synchronized
异步的概念就是独立,相互之间不受到任何制约,两者之间没有任何关系,这里的异步可以理解为多个线程之间不会竞争共享资源。
Synchronized的两种使用方式
1、方法前
2、代码块前(有两种形式)
1)synchronized(this){ }或synchronized{ }代码块中的代码将获得当前对象引用的锁